假设我在C中有以下字符串:
char * str = "1234";
现在我需要所有可能的字母组合:
12
13
14
21
23
24
...
123
124
132
134
142
143
213
214
231
234
241
243
...
412
413
421
423
431
432
我查找了一个解决方案并找到了排列。但排列并不是我想要的。有人有解决这个问题的方法吗?
虽然没有按字典顺序排序,但以下代码将打印原始字符串中字符的powerset元素的所有排列。
#include <stdio.h>
#include <string.h>
void swap(char* arr, int i, int j) {
char t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
void permute(char *str, int i, int n) {
for (int j = i; j < n; j++) {
swap(str, i, j);
if (!str[i]) {
printf("%s\n", str);
} else {
permute(str, i+1, n);
}
swap(str, i, j);
}
}
int main(void) {
char str[] = "1234";
permute(str, 0, strlen(str) + 1);
}
使用bell算法,我生成原始字符串中包含空终止符的字符的所有排列。然后我在条件中烘焙,在传递null终止符时打印并中止当前的排列,以防止打印原始字符的相同子集的重复。