检查字符串是否包含C ++中所有大小为K的二进制代码

假设我们有一个二进制字符串s和一个整数k。我们必须检查长度为k的每个二进制代码是否为s的子字符串。否则,返回False。

因此,如果输入类似于S =“ 00110110”,k = 2,则输出为true。长度为2的二进制代码为“ 00”,“ 01”,“ 10”和“ 11”。它们分别位于索引0、1、3和2。

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

  • 定义一组v

  • temp:=空字符串

  • 要求:= 2 ^ k

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

    • 返回真

    • 将temp插入v

    • 从temp的第一个索引中删除一个字符

    • temp:= temp + s [i]

    • 如果i> = k,则-

    • 如果i> = k-1,则-

    • 如果v的大小与req相同,则-

    • 返回假

    例 

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

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long int lli;
    class Solution {
    public:
       lli fastPow(lli b, lli p){
          lli ret = 1;
          while (p) {
             if (p & 1) {
                ret *= b;
             }
             b *= b;
             p >>= 1;
          }
          return ret;
       }
       bool hasAllCodes(string s, int k) {
          unordered_set<string> v;
          string temp = "";
          lli req = fastPow(2, k);
          for (lli i = 0; i < s.size(); i++) {
             temp += s[i];
             if (i >= k) {
                temp.erase(0, 1);
             }
             if (i >= k - 1) {
                v.insert(temp);
             }
             if ((lli)v.size() == req)
                return true;
          }
          return false;
       }
    };
    main(){
       Solution ob;
       cout << (ob.hasAllCodes("00110110",2));
    }

    输入项

    "00110110",2

    输出结果

    1