1178.ワードパズル

外国人の友達が中国語の単語パズルをベースにした英語版の単語推測ゲームをデザインしました。ぜひ推測してみてください。

パズルファンは、次の2つの条件がpuzzleあればword単語が与えられた文字列に直面し、それが答えとして数えられます。

単語wordにはpuzzle最初の文字のなぞなぞ含まれていますなぞなぞの各文字の
単語wordpuzzleにあります。
たとえば、パズルのなぞなぞがである場合、"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文字しかないため、int2進数タイプ別に記録できます。同様に、回答に対応するビットパターンを順番に取得し、ハッシュテーブルにサブパターンがあるかどうかをそれぞれカウントすることができます。さらに、トピックの要件に従って、密度のサブパターンには最初の文字が含まれている必要があります。

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

おすすめ

転載: blog.csdn.net/WhiteGray/article/details/114156431