c中所有char *的组合?

时间:2019-03-01 22:13:09

标签: c algorithm permutation

让我说我在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

我查找了一个解决方案,并找到了排列。但是排列不是我想要的。 有人可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

虽然未按字典顺序排序,但以下代码将打印原始字符串中字符的幂集的所有排列。

#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);
}

使用响铃算法,我生成了原始字符串中所有字符的排列,包括空终止符。然后,我烘烤一个条件,该条件将在传递空终止符时打印并中止当前排列,以防止打印与原始字符相同子集的副本。