???怎么样从一字符串中取出各字符的所有组合?

zhouqingyuan 2003-11-11 01:34:13
请写程序实现,考虑重复问题!
...全文
94 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouqingyuan 2003-11-11
  • 打赏
  • 举报
回复
//从字符串中选出所有字符的组合

#include <iostream>
#include <string>

using namespace std;

string s;

void Combination(string st, int nt, string rt,int n)
{
string rtt=rt+st[nt];
string stt=st;
stt.erase(nt, 1);
if(rtt.size()==n)
{
cout << rtt << endl;
return;
}
for(int i=nt; i<stt.size(); i++)
{
if(i>nt && stt[i]==stt[i-1])//去除重复的情况
continue;
Combination(stt, i, rtt,n);
}
return;
}

int main()
{

while(cin >> s )
{
for(int n=1;n<=s.size();n++)
{
for(int i=0; i<s.size(); i++)
{

if(i>0 && s[i]==s[i-1])//去除重复的情况
continue;
Combination(s, i, "",n);
}
}
}
return 0;
}
应该是这样的,考虑了好久,今天得到答案,谢谢各位了!
zhouqingyuan 2003-11-11
  • 打赏
  • 举报
回复
回复人: loewe(可怜没人爱)
恩,你的是对的,改改就可以了。
zhouqingyuan 2003-11-11
  • 打赏
  • 举报
回复
我说考虑重复的意思是要考虑重复,但得到的结果中要去掉重复的情况!!
loewe 2003-11-11
  • 打赏
  • 举报
回复
晕,我帖的代码改改不就好了?
zhouqingyuan 2003-11-11
  • 打赏
  • 举报
回复
我的意思是说当然要考虑重复情况的,比如aaab,
正常输出应该是a,aa,aaa,ab,aab,aaab,但是如果按集合求子集的方法来求会得到,a,aa,aaa,ab,ab,ab,。。。这种形式的,请再解释一下
loewe 2003-11-11
  • 打赏
  • 举报
回复
以上代码有个快速排序的过程偶没有copy进来,其实原意是先排序,然后对重复的不输出
loewe 2003-11-11
  • 打赏
  • 举报
回复
给你段程序参考一下,上次SAMS比赛时留下的:输入的s是字符串,n代表要输出多少位的组合
如输入:
asdfg 3
输出就是:

asd
asf
asg
adf
adg
afg
sdf
sdg
sfg
dfg

代码:
#include <iostream>
#include <string>

using namespace std;

string s;

void Combination(string st, int nt, string rt)
{
string rtt=rt+st[nt];
string stt=st;
stt.erase(nt, 1);
if(rtt.size()==n)
{
cout << rtt << endl;
return;
}
for(int i=nt; i<stt.size(); i++)
{
if(i>nt && stt[i]==stt[i-1])
continue;
Combination(stt, i, rtt);
}
return;
}

int main()
{
int n ;
while(cin >> s >> n)
{
for(int i=0; i<s.size(); i++)
{
if(i>0 && s[i]==s[i-1])
continue;
Combination(s, i, "");
}
}
return 0;
}
loewe 2003-11-11
  • 打赏
  • 举报
回复
说得对,上次的SAMS里有个题目就是这样的,对于重复的要先去掉还是...楼主要说清楚呀
ZhangYv 2003-11-11
  • 打赏
  • 举报
回复
重复不重复有什么关系吗?
你是说字符串需要排除重复情况,还是也要取到重复情况?
如果字符串 "aaabcd"也要取到重复情况就是直接用那个算法.
如果不需要重复情况,只要做一个预处理"aaabcd"变成"abcd",再使用.
差别就是有没有"预处理"的过程,这个很简单,就不需要多说了.
zhouqingyuan 2003-11-11
  • 打赏
  • 举报
回复
期盼高手来解决!!!!

注意重复问题!!!
zhouqingyuan 2003-11-11
  • 打赏
  • 举报
回复
但题目比去集合中的子集问题要更复杂,因为字符串中有重复的字符,关键是重复的问题比较麻烦!
ZhangYv 2003-11-11
  • 打赏
  • 举报
回复
上面的程序是取一个普通组合数的,如C(N,M):
#include <stdio.h>
#include <stdlib.h>
const int MAXSIZE = 80;
int N,M;
int A[MAXSIZE], B[MAXSIZE];
void Print()
{
int i;
for (i = 0; i < M; ++i)
printf("%d ", B[i]);
printf("\n");
}

void Com(int n, int m)
{
int i;
for (i = n; i >= m; --i){ //抽屉原理
B[m] = A[i];
if (m > 0)
Com(i-1,m-1);
else
Print();
}
}
int main()
{
int i;
/* printf("%s", "Input N M = ");
scanf("%d%d", &N,&M);
*/
N = 5;
M=3;
if (N > MAXSIZE)
return 1; //越界
for (i = 0; i < N; ++i)
A[i] = i+1;
Com(N-1,M-1);
system("pause");
return 0;
}
下面是求一个集合的所有子集,是NP问题,也就是你要的解答:

一个取集合的所有子集的算法:
void Calcu(int i, const int n, int A[], int B[])
{
if(i>=n){
int j;
for (j = 0; j < n; j++)
if (B[j]) printf("%c",A[j]);
printf("\n");
} else {
B[i] = 1; //取第i个元素
Calcu(i+1, n, A, B);
B[i] = 0; //舍第i个元素
Calcu(i+1, n, A, B);
}
}//集合的幂集问题是NPC的,也就是说规模是指数级别,上述程序效率是O(2^n)
转自:
http://expert.csdn.net/Expert/topic/2059/2059607.xml?temp=.5402033

zhouqingyuan 2003-11-11
  • 打赏
  • 举报
回复
怎么没有人来回答呢??
zhouqingyuan 2003-11-11
  • 打赏
  • 举报
回复
up
zhouqingyuan 2003-11-11
  • 打赏
  • 举报
回复
自己UP

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧