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

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    
;

以上是关于LeetCode 1255 得分最高的单词集合状态压缩 位运算HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 1255. 得分最高的单词集合

LeetCode 5258. 得分最高的单词集合 Maximum Score Words Formed by Letters

LeetCode 2155. 分组得分最高的所有下标

[leetcode] 798 得分最高的最小轮调 - 思维dp

LeetCode 504. 七进制数 / 2055. 蜡烛之间的盘子 / 798. 得分最高的最小轮调(差分数组)

Leetcode 5379. 石子游戏 III(第183场周赛)