假设我们有一个二进制字符串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