检查二进制字符串是否包含C ++中长度为k的所有排列
假设我们有一个二进制字符串,另一个整数k。我们必须检查字符串是否包含k位二进制的所有排列。假设一个字符串像“11001”,并且如果K=2,则它必须具有k位数字的所有排列。(00,01,10,11),给定的字符串具有所有排列。因此,这是有效的字符串。
通过获取二进制字符串和k的值,我们必须检查二进制序列是否匹配。二进制序列的大小为k。因此,将有2k个不同的二进制排列。我们将把长度为k的二进制值的所有排列作为字符串存储在列表中,然后将列表中存在的所有元素作为给定字符串的子集进行比较。如果我们对列表中存在的所有字符串都为真,则该字符串有效,否则无效。
示例
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
vector<string> binaryPermutations(int k){
vector<string> list;
int n = 0;
string bin_str = "";
for(int i = 0; i<k; i++){
bin_str += "0";
}
int limit = pow(2, k);
list.push_back(bin_str);
for(int i=1; i<limit; i++){
int j = 0;
while(j <= k){
if(bin_str[k-1-j] == '0'){
bin_str[k - 1 - j] = '1';
break;
} else {
bin_str[k - 1 - j] = '0';
j++;
}
}
list.push_back(bin_str);
}
return list;
}
bool hasAllPermutation(string str, int k){
vector<string> list = binaryPermutations(k);
for(int i = 0; i<list.size(); i++){
string substr = list[i];
std::size_t found = str.find(substr);
if(found == std::string::npos){
return false;
}
}
return true;
}
int main() {
int k = 2;
string str = "11001";
if(hasAllPermutation(str, k)){
cout << "具有所有排列";
} else {
cout << "找不到所有排列";
}
}输出结果
具有所有排列