我编写了一个通用程序来生成字符串的排列,但删除了重复的情况。为此,我使用了记忆。
void permute(char *a,int i, int n,set<char*> s)
{
if(i==n)
{
if(s.find(a)==s.end()){
cout<<"no dublicate"<<endl;
cout<<a<<endl;
s.insert(a)
}
}
else{
for(int j=i;j<n;j++)
{
swap(a[i],a[j]);
permute(a,i+1,n,s);
swap(a[i],a[j]);
}
}
}
int main()
{
char a[]="aba";
set <char*> s;
permute(a,0,3,s);
return 0;
}
但结果并不理想。它打印所有排列。任何人都可以帮我解决问题。
答案 0 :(得分:3)
首先,您按值传递set<> s
参数,这会丢弃每个插入内容,因为它仅在s
的本地副本中完成。但是,即使您将其更改为通过引用传递,它也不会起作用,因为每次插入相同的char *值时,只会执行一次插入。为了使您的代码正常工作,我建议您将函数的原型更改为
void permute(string a,int i, int n,set<string>& s)
这样就行了。
更新包含所描述的微小更改的源代码
void permute(string a,int i, int n,set<string>& s)
{
if(i==n)
{
if(s.find(a)==s.end()){
cout<<"no dublicate"<<endl;
cout<<a<<endl;
s.insert(a);
}
}
else{
for(int j=i;j<n;j++)
{
swap(a[i],a[j]);
permute(a,i+1,n,s);
swap(a[i],a[j]);
}
}
}
int main()
{
string a ="aba";
set <string> s;
permute(a,0,3,s);
return 0;
}