직접 일치하는 경우 단어와 퍼즐은 모두 한 번 통과해야하므로 시간 복잡도는 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;
}
};