我正在努力完成我的任务。我们的任务是从输入中进行所有可能的排列(已按字母顺序排列)。我的代码只适用于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
答案 0 :(得分:1)
给定一个字符数组,比如说"acute"
,您可以按字母顺序进行下一个排列:
"ute"
; 'c'
; "ute"
中大于'c'
的最小字符是'e'
; "utc"
后面的后缀'e'
; "aectu"
。如果你开始在按字母顺序给出的字符串上迭代上述算法(例如"acetu"
),你将按字母顺序获得所有排列,并以反向字母顺序停止字符串({{ 1}})。
EDIT1
由于'是一个大于'要求的最小字符,算法会正确处理重复字符。示例:对于"uteca"
,它将标识后缀"tada"
并将前面的"da"
与'a'
交换,而不是与最后'd'
交换,因此找到的下一个排列是'a'
。
因此,该算法以字母顺序查找所有不同的排列,与仅使用字符位置的算法不同。