外国人の友達が中国語の単語パズルをベースにした英語版の単語推測ゲームをデザインしました。ぜひ推測してみてください。
パズルファンは、次の2つの条件がpuzzle
あればword
、単語が与えられた文字列に直面し、それが答えとして数えられます。
単語word
にはpuzzle
最初の文字のなぞなぞが含まれています。なぞなぞの各文字の
単語word
はpuzzle
にあります。
たとえば、パズルのなぞなぞがである場合、"abcdefg"
答えの単語"faced"
が"cabbage"
あり"baggage"
、; while "beefed"
(文字を除く"a"
)と"based"
("s"
なぞなぞには表示されません)は答えとして使用できません。
回答配列を返します。配列のanswer
各要素にanswer[i]
は単語のリストが与えられ、回答に対応する単語のwords
パズルファンプレーンpuzzles[i]
数にすることができます。
例:
输入:
words = ["aaaa","asas","able","ability","actt","actor","access"],
puzzles = ["aboveyz","abrodyz","abslute","absoryz","actresz","gaswxyz"]
输出:[1,1,3,2,4,0]
解释:
1 个单词可以作为 "aboveyz" 的谜底 : "aaaa"
1 个单词可以作为 "abrodyz" 的谜底 : "aaaa"
3 个单词可以作为 "abslute" 的谜底 : "aaaa", "asas", "able"
2 个单词可以作为 "absoryz" 的谜底 : "aaaa", "asas"
4 个单词可以作为 "actresz" 的谜底 : "aaaa", "asas", "actt", "access"
没有单词可以作为 "gaswxyz" 的谜底,因为列表中的单词都不含字母 'g'。
促す:
1 <= words.length <= 10^5
4 <= words[i].length <= 50
1 <= puzzles.length <= 10^4
puzzles[i].length == 7
words[i][j], puzzles[i][j]
すべて小文字の英字。- それぞれに
puzzles[i]
含まれる文字は繰り返されません。
回答
この質問はあまり良くありません。公式の解決策を参照してください。バイナリビットを使用して文字列をエンコードします。タイトルはword
文字が表示される回数を一致させる必要がないため、文字が表示される限りword
、対応する26ビットの1つを1に設定し、ハッシュテーブルを使用して同じものを記録します。パターンのワード数は26文字しかないため、int
2進数をタイプ別に記録できます。同様に、回答に対応するビットパターンを順番に取得し、ハッシュテーブルにサブパターンがあるかどうかをそれぞれカウントすることができます。さらに、トピックの要件に従って、密度のサブパターンには最初の文字が含まれている必要があります。
class Solution {
public:
vector<int> findNumOfValidWords(vector<string>& words, vector<string>& puzzles) {
unordered_map<int, int> frequency;
for(auto& word : words){
int bitmask = 0;
for(char ch : word){
bitmask |= (1 << (ch - 'a'));
}
frequency[bitmask]++;
}
vector<int> result;
for(auto& puzzle : puzzles){
int bitmask = 0;
// 求谜底除了首字母之外的模式
for(char ch : puzzle){
bitmask |= (1 << (ch - 'a'));
}
bitmask ^= (1 << (puzzle[0] - 'a'));
int count = 0;
int sub = bitmask;
while(true)
{
// 包含首字母的子模式
int temp = sub | (1 << (puzzle[0] - 'a'));
if(frequency.count(temp)){
count += frequency[temp];
}
sub = (sub - 1) & bitmask;
if(sub == bitmask)
break;
}
result.push_back(count);
}
return result;
}
};