排列按字母顺序排列

时间:2016-12-09 21:16:48

标签: c permutation

我正在努力完成我的任务。我们的任务是从输入中进行所有可能的排列(已按字母顺序排列)。我的代码只适用于3个字符,之后它没有用,我希望它能做什么。我现在一直在寻找一个错误5个小时,没有任何成功。

void perm(char *input_arr, int len_arr, int done) {
    if (done == len_arr - 1) {
        for (int i = 0; i < len_arr; i++) {
            printf("%c", perm[i]);
        }
        printf("\n");
    } else {
        for (int i = done; i < len_arr; i++) {
            swapityy_swap(&perm[done], &perm[i]);
            sperm(perm, len_arr, done + 1);
            swapityy_swap(&perm[done], &perm[i]);
        }
        qsort(perm, len_arr, sizeof(char), compity_dawg);
    }
}

期待收到你的回复,luv&lt; 3

1 个答案:

答案 0 :(得分:1)

给定一个字符数组,比如说"acute",您可以按字母顺序进行下一个排列:

  • 识别单词的反向排序后缀('tail');在此示例中,它是"ute";
  • 如果后缀是整个单词,那么你有最后的排列 - 停止;否则取后缀前面的字符;在此示例中,它是'c';
  • 在后缀中找到比前一个字符大的最小字符;在示例中,"ute"中大于'c'的最小字符是'e';
  • 交换它们;您获得"utc"后面的后缀'e';
  • 后缀中的反转字符(按字母顺序排序),您有下一个排列:"aectu"

如果你开始在按字母顺序给出的字符串上迭代上述算法(例如"acetu"),你将按字母顺序获得所有排列,并以反向字母顺序停止字符串({{ 1}})。

EDIT1

由于'是一个大于'要求的最小字符,算法会正确处理重复字符。示例:对于"uteca",它将标识后缀"tada"并将前面的"da"'a'交换,而不是与最后'd'交换,因此找到的下一个排列是'a'
因此,该算法以字母顺序查找所有不同的排列,与仅使用字符位置的算法不同。