Leetcode 1178. 단어 퍼즐 (상태 압축 및 하위 집합 일치)

직접 일치하는 경우 단어와 퍼즐은 모두 한 번 통과해야하므로 시간 복잡도는 O (N * M * len)이며 확실히 시간 초과됩니다.

여기서는 단어의 모든 문자 만 퍼즐에서 찾을 수 있어야하므로 단어를 압축하고 단어를 정수 int로 매핑 할 수 있습니다. 범위는 0에서 2 ^ 26 제곱으로이 문자열에 포함 된 문자를 표시하고 다음을 사용합니다. 단어 빈도를 계산하는 HashMap.

다음으로 퍼즐을 탐색합니다. 각 퍼즐에는 7 자리 숫자가 있으므로 반복되는 숫자가없고 0 번째 숫자를 사용해야하므로 첫 번째 숫자부터 퍼즐의 하위 문자열을 열거하고 해시 맵으로 이동하여 해당 단어를 찾습니다. , 당신은 최종 답을 얻을 수 있습니다.

class Solution {
public:
    vector<int> findNumOfValidWords(vector<string>& words, vector<string>& puzzles) {
        // 字符串状态压缩,将字符串word->二进制数组
        unordered_map<int,int> hashmap;
        vector<int> res;
        for(auto const &word:words){
            int mask = 0;
            for(auto const &c:word){
                mask |= 1<< (c - 'a');
            }
            hashmap[mask]++;
        }

        // puzzles的长度最长为7,第一位固定,子串共有2^6个状态。
        for(auto const &p:puzzles){
            int count = 0;
            for(int i=0;i<1<<6;i++){
                int mask = 0;
                for(int j=0;j<6;j++){
                    if(i&(1<<j)){
                        mask |= (1 << (p[j + 1] - 'a'));
                    }
                }
                mask |= (1<<(p[0]-'a'));
                count+=hashmap[mask];
            }
            res.push_back(count);
        }
        return res;
    }
};

 

추천

출처blog.csdn.net/wwxy1995/article/details/114140676