【发布时间】:2013-08-10 08:50:24
【问题描述】:
我有这个代码来生成字典排列。使用如下逻辑:
- 从给定测试字符串中字符的升序排列开始。
- 要生成下一个字典排列:
a) 找到比下一个字符小的最右边的字符。说一个。
b) 在 A 的右边,找到下一个更大的字符。说 B。然后交换 A 和 B。
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;}
开始功能:
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";}
主呼叫:nextpermute(test);
如果测试字符串是"01234567" 或任何比这更小的字符串,它运行良好。但如果它是一个类似的字符串
"012345678" 或 "0123456789" ,然后我得到分段错误。
请帮忙!!
【问题讨论】:
-
std::next_permutation有什么问题? -
@chris 我正在尝试自己解决这个问题。一旦通过,我肯定会使用它
-
为什么你使用
strcmp和s.c_str()而不是operator==和s?您已设法获取安全代码并使其不安全。 -
哦,是的!刚刚从我的脑海中滑落,我可以直接比较字符串对象。无论如何,这仍然不能解决我的问题。
-
如果你遇到了段错误,你应该在调试器中运行你的代码来确定是哪一行导致了问题。然后从那里向后工作。
标签: c++ c segmentation-fault permutation lexicographic