各パズルの有効な単語の数1178

トピック説明

  この最後の質問は、2019年9月1日LeetCode週のレースの対象であります

タイトル説明

与えられたに関しては  puzzle 、文字列、aが  word あり  、有効な  次の両方の条件が満たされた場合:

  • word の最初の文字が含まれています  puzzle
  • 内の各文字について  word、その文字はです puzzle

    例えば、パズルは、「ABCDEFG」、そして有効な言葉は「直面」している、「キャベツ」、および「荷物」のであれば、無効な単語は「強化し」(「A」を含んでいない)と、「基づく」されている間(パズルにない「S」を含みます)。

配列を返し  answer、  answer[i] 与えられた単語リスト内の単語の数である  words パズルに関して有効で  puzzles[i]

サンプル

入力:
言葉 = [ " AAAA "" ASAS "" できる"" 能力"" ACTT "" 俳優"" アクセス" ]、
パズル = [ " aboveyz "" abrodyz "" abslute "" absoryz " "actresz " " gaswxyz" ] 
出力:[ 113240 ] 
説明:
1つの有効な単語のための " aboveyz "" AAAA "  
1つの有効な単語のための " abrodyz "" AAAA " 
3つの有効な単語のための " abslute "" AAAA " " ASAS " "できます"
2つの有効な言葉のための " absoryz "" AAAA "" ASAS " 
4つの有効な言葉のための " actresz "" AAAA "" ASAS "" ACTT "" アクセス" 
があり' "gaswxyz"原因なしには有効な単語を再んリスト内の単語の文字が含まグラムを

条件

  • 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] 繰り返される文字が含まれていません。

問題解決のためのアイデア

①最初のトラバーサルワード再び、次いで(インデックスとして単語文字-'a」の内部、すなわち、)を指標として、各単語の文字の内側は、対応するアレイに配置されたワード

②ワードに対応する一意の値を算出します

  私は、26進表現を使用して、例えば、A-B-A 11のように表現してい

  << 1(()繰返さない文字に対応する - 「A」)に対応する文字の位置を算出します

  反復文字が考慮されないように第11及び第2の表現Bを発現しました

③アレイトラバーサルパズルは、また、単語に対応する対応する一意の値を算出し、トラバース次に、タイトルの単語検索満たす意味(タイトル要件が意図され、単語に含まれるワードパズルの最初の文字)の最初の文字を使用して配列のインデックスに対応するワード

④対象単語を決定する条件を満たしています

  使用される方法は、一意の値が等しくなるように決定されるビット操作とワード操作の操作に対応するユニークワードパズルの値によって決定される固有の値であり、条件が満たされ

    如単語= "A"、パズル= "AB"

    111の値のみ

    操作された後1&

  &演算子よりも低い優先順位==:それはことに留意すべきです

コード

    vector<int>w;
    vector<int>wf[26];
    bool vis[26];
    vector<int> findNumOfValidWords(vector<string>& words, vector<string>& puzzles) {
        
        for(int i=0;i<words.size();i++){
            memset(vis,false,sizeof(vis));
            int tmp = 0;
            
            for(int j=0;j<words[i].size();j++){
                if(!vis[words[i][j]-'a']){
                    tmp+=(1<<(words[i][j]-'a'));
                    vis[words[i][j]-'a']=true;
                    wf[words[i][j]-'a'].push_back(i);
                    
                }
            }

            w.push_back(tmp);
        }
        
        vector<int>res;
        for(int i=0;i<puzzles.size();i++){
            int index = puzzles[i][0]-'a';
            int h  = 0;
            for(int j=0;j<7;j++){
                h+=(1<<(puzzles[i][j]-'a'));
            }
            int cnt =0 ;
            for(int j=0;j<wf[index].size();j++){        
                if((w[wf[index][j]]&h)==w[wf[index][j]]){
                    cnt++;
                }
            }
            res.push_back(cnt);
        }
        return res;
        
    }
Code

おすすめ

転載: www.cnblogs.com/lyhcc/p/11443460.html