生成词典排列:分段错误

时间:2013-08-10 08:50:25

标签: c++ c segmentation-fault permutation lexicographic

我有这个代码来生成词典排列。使用以下逻辑:

  1. 从给定测试字符串中字符的递增顺序排列开始。
  2. 生成下一个词典排列:
  3. 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",然后我会遇到细分错误。 请帮忙!!

1 个答案:

答案 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限制永远不会越过