LeetCode 1255 得分最高的单词集合【状态压缩 位运算】HERODING的LeetCode之路

在这里插入图片描述

解题思路:
一道非常好理解的题目,关键点在于用到的方法。题目就是在给定的单词集合和字母集合下,能够组成得分最高的单词子集的得分,本质上就是遍历所有的单词子集,判断子集中的单词能否由字母集合构成,然后计算得分,返回最大得分。这里在遍历集合的时候用到位运算,来判断当前位置单词是否在当前子集内,步骤如下:

  1. 统计字母表所有字母个数;
  2. 遍历每个集合,遍历每个单词,判断单词是否在集合内;
  3. 计算当前集合内所有单词的得分,字母无法构成的单词跳过;
  4. 更新得分;
  5. 返回最大得分。

代码如下:

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;
    }
};

猜你喜欢

转载自blog.csdn.net/HERODING23/article/details/129222050
今日推荐