C ++中每个难题的有效单词数

假设有一个拼图字符串,如果以下两个条件均有效,则单词有效-

  • 这个词包含拼图的第一个字母。

  • 对于单词中的每个字母,该字母都是拼图。

假设我们举一个例子,如果谜题是“ abcdefg”,那么有效的单词是“ face”,“ cabbage”等。但是有些无效的单词是“ beefed”的,因为没有“ a”和“ based”,因为没有“ s”,这在拼图中不存在。

我们必须找到答案列表,其中答案[i]是给定单词列表中相对于拼图游戏[i]有效的单词数。

因此,如果输入像单词= [“ aaaa”,“ asas”,“ able”,“ ability”,“ actt”,“ actor”,“ access”],难题= [“ aboveyz”,“ abrodyz”, “ abslute”,“ absoryz”,“ actresz”,“ gaswxyz”],则输出为[1,1,3,2,4,0],作为“ aboveyz”的一个有效词:“ aaaa”,一个“ abrodyz”的有效词:“ aaaa”,“ abslute”的三个有效词:“ aaaa”,“ asas”,“ able”,“ absoryz”的两个有效词:“ aaaa”,“ asas”,四个有效词代表“ actresz”:“ aaaa”,“ asas”,“ actt”,“ access”,并且“ gaswxyz”没有有效的词,因为列表中没有一个词包含字母“G'。

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个函数getMask(),需要s,

  • 遮罩:= 0

  • 对于初始化i:= 0,当i <s的大小时,更新(将i增加1),执行-

    • mask:= mask或2 ^(s [i]-'a'的ASCII)

  • 返回面具

  • 从主要方法中执行以下操作-

  • 定义一个数组ans

  • 定义一张映射

  • 对于初始化i:= 0,当i <w的大小时,更新(将i增加1),执行-

    • mask:= mask或getMask(w [i])

    • 字:= w [i]

    • 遮罩:= 0

    • 对于初始化j:= 0,当j <字长时,更新(将j增加1),-

    • (将m [mask]增加1)

  • 对于初始化i:= 0,当i <p的大小时,更新(将i增加1),执行-

    • 如果current&first不为零,则-

    • 当前:=(当前-1)AND遮罩

    • 字:= p [i]

    • 掩码:= getMask(word)

    • first:= 2 ^(word [0]-'a'的ASCII)

    • 当前:=遮罩

    • 温度:= 0

    • 当电流> 0时,执行-

    • 在ans的末尾插入temp

    • 返回ans

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<auto> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    typedef long long int lli;
    class Solution {
       public:
       lli getMask(string s){
          lli mask = 0;
          for(int i =0;i<s.size();i++){
             mask|= 1<<(s[i]-'a');
          }
          return mask;
       }
       vector<int> findNumOfValidWords(vector<string>& w, vector<string>& p) {
          vector <int> ans;
          map <lli, lli > m;
          for(int i =0;i<w.size();i++){
             string word = w[i];
             lli mask = 0;
             for(int j =0;j<word.size();j++){
                mask|= getMask(w[i]);
             }
             m[mask]++;
          }
          for(int i = 0; i<p.size();i++){
             string word = p[i];
             lli mask = getMask(word);
             lli first = 1<<(word[0]-'a');
             lli current = mask;
             lli temp = 0;
             while(current>0){
                if(current & first)temp+=m[current];
                current = (current-1)&mask;
             }
             ans.push_back(temp);
          }
          return ans;
       }
    };
    main(){
       Solution ob;
       vector<string> v = {"aaaa","asas","able","ability","actt","actor","access"};
       vector<string> v1 = {"aboveyz","abrodyz","abslute","absoryz","actresz","gaswxyz"};
       print_vector(ob.findNumOfValidWords(v,v1));
    }

    输入值

    {"aaaa","asas","able","ability","actt","actor","access"},
    {"aboveyz","abrodyz","abslute","absoryz","actresz","gaswxyz"}

    输出结果

    [1, 1, 3, 2, 4, 0, ]