Description Link to heading
1255. Maximum Score Words Formed by Letters (Hard)
Given a list of words
, list of single letters
(might be repeating) and score
of every
character.
Return the maximum score of any valid set of words formed by using the given letters (
words[i]
cannot be used two or more times).
It is not necessary to use all characters in letters
and each letter can only be used once. Score
of letters 'a'
, 'b'
, 'c'
, … , 'z'
is given by score[0]
, score[1]
, … , score[25]
respectively.
Example 1:
Input: words = ["dog","cat","dad","good"], letters = ["a","a","c","d","d","d","g","o","o"], score =
[1,0,9,5,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0]
Output: 23
Explanation:
Score a=1, c=9, d=5, g=3, o=2
Given letters, we can form the words "dad" (5+1+5) and "good" (3+2+2+5) with a score of 23.
Words "dad" and "dog" only get a score of 21.
Example 2:
Input: words = ["xxxz","ax","bx","cx"], letters = ["z","a","b","c","x","x","x"], score =
[4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,10]
Output: 27
Explanation:
Score a=4, b=4, c=4, x=5, z=10
Given letters, we can form the words "ax" (4+5), "bx" (4+5) and "cx" (4+5) with a score of 27.
Word "xxxz" only get a score of 25.
Example 3:
Input: words = ["leetcode"], letters = ["l","e","t","c","o","d"], score =
[0,0,1,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0]
Output: 0
Explanation:
Letter "e" can only be used once.
Constraints:
1 <= words.length <= 14
1 <= words[i].length <= 15
1 <= letters.length <= 100
letters[i].length == 1
score.length == 26
0 <= score[i] <= 10
words[i]
,letters[i]
contains only lower case English letters.
Solution Link to heading
We can use a hash table letters_arr
to keep track of the numbers of letters that can be used when backtracking.
Code Link to heading
class Solution {
public:
int dfs(int st_idx, vector<int> &letters_arr, vector<string> &words, vector<int> &score) {
if (st_idx >= words.size()) {
return 0;
}
int maxnum = 0;
for (int i = st_idx; i < words.size(); i++) {
int total = 0;
bool check = true;
for (char &c : words[i]) {
letters_arr[c - 'a']--;
total += score[c - 'a'];
if (letters_arr[c - 'a'] < 0) {
check = false;
}
}
if (check) {
maxnum = std::max(maxnum, total + dfs(i + 1, letters_arr, words, score));
}
for (char &c : words[i]) {
letters_arr[c - 'a']++;
}
}
return maxnum;
}
int maxScoreWords(vector<string> &words, vector<char> &letters, vector<int> &score) {
vector<int> words_arr(26, 0);
vector<int> letters_arr(26, 0);
for (int i = 0; i < letters.size(); i++) {
letters_arr[letters[i] - 'a']++;
}
// 回溯
return dfs(0, letters_arr, words, score);
}
};