我知道“最好”是主观的,所以根据你的说法,以下问题的最佳解决方案是什么:
给定一个长度为 n 的字符串(比如“abc”),生成该字符串的所有真子集。因此,对于我们的示例,输出将是 {}、{a}、{b}、{c}、{ab}、{bc}、{ac}。{ABC}。
你怎么看?
我知道“最好”是主观的,所以根据你的说法,以下问题的最佳解决方案是什么:
给定一个长度为 n 的字符串(比如“abc”),生成该字符串的所有真子集。因此,对于我们的示例,输出将是 {}、{a}、{b}、{c}、{ab}、{bc}、{ac}。{ABC}。
你怎么看?
递归方法——“abc”的子集有两种类型:“bc”的子集,以及“a”加上“bc”的子集。所以如果你知道“bc”的子集,就很容易了。
或者,长度为 n 的字符串具有 2^n 个子集。所以写两个嵌套循环: i 从 0 到 2^n -1 计数(对于子集), j 从 0 到 n-1 计数(对于第 i 个子集中的字符)。当且仅当 i 的第 j 位为 1 时,输出字符串的第 j 个字符。
(嗯,你确实说过“最好”是主观的......)
将二进制表示中的数字解释为指示子集中包含哪些元素。假设您的集合中有 3 个元素。数字 4 对应于二进制符号中的 0100,因此您将其解释为大小为 1 的子集,其中仅包含第二个元素。这样,生成所有子集的计数最多为 (2^n)-1
char str [] = "abc";
int n = strlen(str); // n is number of elements in your set
for(int i=0; i< (1 << n); i++) { // (1 << n) is equal to 2^n
for(int j=0; j<n; j++) { // For each element in the set
if((i & (1 << j)) > 0) { // Check if it's included in this subset. (1 << j) sets the jth bit
cout << str[j];
}
}
cout << endl;
}
def subsets(s):
r = []
a = [False] * len(s)
while True:
r.append("".join([s[i] for i in range(len(s)) if a[i]]))
j = 0
while a[j]:
a[j] = False
j += 1
if j >= len(s):
return r
a[j] = True
print subsets("abc")
请原谅伪代码...
int i = 0;
Results.push({});
While(i > Inset.Length) {
Foreach(Set s in Results) {
If(s.Length == i) {
Foreach(character c in inSet)
Results.push(s+c);
}
i++;
}
//recursive solution in C++
set<string> power_set_recursive(string input_str)
{
set<string> res;
if(input_str.size()==0) {
res.insert("");
} else if(input_str.size()==1) {
res.insert(input_str.substr(0,1));
} else {
for(int i=0;i<input_str.size();i++) {
set<string> left_set=power_set_iterative(input_str.substr(0,i));
set<string> right_set=power_set_iterative(input_str.substr(i,input_str.size()-i));
for(set<string>::iterator it1=left_set.begin();it1!=left_set.end();it1++) {
for(set<string>::iterator it2=right_set.begin();it2!=right_set.end();it2++) {
string tmp=(*it1)+(*it2);
sort(tmp.begin(),tmp.end());
res.insert(tmp);
}
}
}
}
return res;
}
//iterative solution in C++
set<string> power_set_iterative(string input_str)
{
set<string> res;
set<string> out_res;
res.insert("");
set<string>::iterator res_it;
for(int i=0;i<input_str.size();i++){
for(res_it=res.begin();res_it!=res.end();res_it++){
string tmp=*res_it+input_str.substr(i,1);
sort(tmp.begin(),tmp.end());
out_res.insert(tmp);
}
res.insert(input_str.substr(i,1));
for(set<string>::iterator res_it2=out_res.begin();res_it2!=out_res.end();res_it2++){
res.insert(*res_it2);
}
out_res.clear();
}
return res;
}