做笔试遇到,记录一下。
求一个字符串的所有子集,也就是所有不连续的子序列的方法。
代码是博客:https://www.freesion.com/article/9876439111/
主要思想是利用和字符串相同长度的二进制数,判断二进制数的每一位是不是1来确定取不取这一位上的字符。
比如:
原字符串s = “abcd”
字符串长度为4,那么一共有2^4个子序列,对应着二进制数0-15,二进制表示就是0000 ~ 1111 。
如果二进制是1101,那么就是取“abd”三个字符的子序列。
#include<iostream>
#include<string>
using namespace std;
int main() {
string str1, str2;
cin >> str1;
int i = 0, j = 0;
//枚举,n个元素,所有子集个数=2的n次方,时间复杂度2的n次方,指数级
int itotal = 1 << str1.length();
for (i = 0; i < itotal; i++) {
for (j = 0; j < str1.length(); j++) { //遍历二进制的每一位,看那一位是不是1.
if (((1 << j) & i) != 0)// 当前j这一位取1,与i做与运算,如果运算结果为1说明这一位要取。
{
cout << str1[j];
}
}
cout << endl;
}
return 0;
}