我有这个代码来生成词典排列。使用以下逻辑:
a)找到比其下一个字符小的最右边的字符。说A。
b)在A的右边,找到下一个更大的角色。 SAY B.并交换A&乙
c)在A的原始位置右侧,按递增顺序对字符进行排序。
当我们得到最后的排列时,算法结束。即反转给定的测试字符串。
我的测试字符串s = "0123456789"
编辑: 在程序的每一次运行中,我都会得到一个单独的分段错误位置。
获得A:
int firstchar(string s){
int pos = s.length()-2;
for(int i=pos;i>=0;i--){
if(s[i]<s[i+1]){
pos = i;
break;
}
}
return pos;}
获取B然后递归方法(qsort是来自<cstdlib>
的函数):
int ceilchar(string s, int fc){
int ceil = fc+1;
int diff=27;
for(int i=ceil;i<s.length();i++){
if(s[i]>s[fc] && s[i]-s[fc]<diff){
ceil = i;
diff = s[i]-s[fc];
}
}
return ceil;}
启动func:
void nextpermute(string& s){
int fc = firstchar(s);
int cc = ceilchar(s,fc);
swap(s,fc,cc);
sort(&s[fc]+1,&s[fc]+s.length()-fc);
if(s!="9876543210"){
cout<<s<<"\n";
nextpermute(s);
}
else
cout<<s<<"\n";}
来自main的电话:nextpermute(test);
如果测试字符串为"01234567"
或小于此值,则效果很好。但如果它是一个字符串
"012345678"
或"0123456789"
,然后我会遇到细分错误。
请帮忙!!
答案 0 :(得分:1)
我怀疑你的筹码量超过了极限。如果您在Linux上运行它,请执行“限制”并查看堆栈大小。有两种方法可以避免这种情况
1)(不推荐)“限制stacksize unlimited”(仅当您使用基于unix的系统时)。然后再次运行程序。
2)(推荐)。
更改
void nextpermute(string& s){
int fc = firstchar(s);
int cc = ceilchar(s,fc);
swap(s,fc,cc);
sort(&s[fc]+1,&s[fc]+s.length()-fc);
if(s!="9876543210"){
cout<<s<<"\n";
nextpermute(s);
}
else
cout<<s<<"\n";
}
到
void nextpermute(string& s){
int fc = firstchar(s);
int cc = ceilchar(s,fc);
swap(s,fc,cc);
sort(&s[fc]+1,&s[fc]+s.length()-fc);
cout <<s<<"\n";
}
并将主要功能修改为
int main()
{
string s = "0123456789";
while (s != "9876543210")
{
nextpermute(s);
}
}
以上更改将取消“nextpermute”的递归,因此您的stacksize限制永远不会越过