【问题标题】:Permutations alphabetically ordered按字母顺序排列
【发布时间】:2016-12-09 21:16:47
【问题描述】:

我正在为我的任务而苦苦挣扎。我们的任务是对输入进行所有可能的排列(已经按字母顺序排列)。我的代码仅适用于 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);
    }
}

期待您的回音,亲爱的

【问题讨论】:

  • 您提供的代码似乎不太可能完全工作,至少如果您将“工作”定义为打印perm() 通过参数接收的数组的排列input_arr。它必须实际检查数组的内容才能实现这一点。在此之前,它必须实际编译。
  • 在询问运行时错误时,正如这个问题所做的那样,需要发布干净编译、简短且仍然显示错误的代码。发布输入数据,发布实际输出,发布预期输出。
  • 为了便于阅读和理解:1) 通过一个空行分隔代码块(for、if、else、while、do...while、switch、case、default)。 2)遵循公理:*每行只有一个语句,并且(最多)每个语句一个变量声明。 (考虑一个右大括号'}。作为一个单独的语句。
  • 发布的代码缺少#include 语句、输入数据、预期输出、实际输出、main() 函数、comity_dawg() 函数。 swapityy_swapp() 函数。发布的函数名为:perm(),它有 3 个参数,但那些递归调用只有一个参数
  • 我想补充一下上面@user3629249 所说的内容:库函数qsort 对数组进行排序——但是你传递了一个函数给它(第一个参数是perm) ! swapityy_swap 调用也存在同样的问题...此外,您进行了类似递归调用的操作——但被调用者实际上不是调用者(spermperm)!一般来说:这不是一个正在运行甚至是可编译的代码。它并非全部工作

标签: c permutation


【解决方案1】:

给定一个字符数组,例如"acute",您可以按这种方式按字母顺序进行下一个排列:

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

如果您开始对按字母顺序给出的字符串(例如"acetu")迭代上述算法,您将按字母顺序获得所有排列并以反向字母顺序的字符串停止("uteca") .

编辑1

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

【讨论】: