字符串长度为 n ,字符串中的每一个字符字符都可能存在其子序列中,也可能不存在,所以一共有 2^n 种可能性,即长度为 n 字符串有 2^n 字串(子序列)。
时间复杂度O(n×2^n)
方式一:位运算(个人认为最好理解最方便的方式)
用 '1' 表示字符串的元素存在子序列中, '0' 表示不存在。
用 0 ~ 2^n-1 代表 子串集
如"abc"
数字 二进制 子串
0 000 ""
1 001 "c"
2 010 "b"
3 011 "bc"
...
c++代码
//字符串s 要求子串的字符串 设长度为n
vector<string> sub(string s){
vector<string> ans ;
// 1 << s.length() 为 2^n -1
for(int i = 0; i < (1<<s.length()); i++){
string tmp = "";
for(int j = s.length()-1; j >= 0 ; j--){
if(((i >> j)&1) == 1){
tmp += s[j];
}
}
ans.push_back(tmp);
}
return ans;
}
java代码
private List<String> subsequence(String s){
List<String> ans = new ArrayList<>();
for (int i = 0; i < (1 << s.length()); i++) {
String t = "";
for (int j = s.length()-1; j >= 0 ; j--) {
if (((i >> j) & 1) == 1)
t += s.charAt(j);
}
ans.add(t);
}
return ans;
}