检查字符串是否包含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