解题思路:
一道非常好理解的题目,关键点在于用到的方法。题目就是在给定的单词集合和字母集合下,能够组成得分最高的单词子集的得分,本质上就是遍历所有的单词子集,判断子集中的单词能否由字母集合构成,然后计算得分,返回最大得分。这里在遍历集合的时候用到位运算,来判断当前位置单词是否在当前子集内,步骤如下:
- 统计字母表所有字母个数;
- 遍历每个集合,遍历每个单词,判断单词是否在集合内;
- 计算当前集合内所有单词的得分,字母无法构成的单词跳过;
- 更新得分;
- 返回最大得分。
代码如下:
class Solution {
public:
int maxScoreWords(vector<string>& words, vector<char>& letters, vector<int>& score) {
int n = words.size(), res = 0;
vector<int> count(26);
for(auto& c : letters) {
count[c - 'a'] ++;
}
// 遍历所有子集
for(int i = 1; i < (1 << n); i ++) {
// 记录子集的字母
vector<int> curCount(26);
// 遍历每一个单词
for(int j = 0; j < n; j ++) {
// 判断单词是否在子集里
if((i & (1 << j)) == 0) {
continue;
}
for(auto& c : words[j]) {
curCount[c - 'a'] ++;
}
}
bool flag = true;
int sum = 0;
for(int j = 0; j < 26; j ++) {
sum += score[j] * curCount[j];
flag = (curCount[j] <= count[j]);
if(!flag) {
break;
}
}
if(flag) {
res = max(res, sum);
}
}
return res;
}
};