Вся комбинация символа * в с? - PullRequest
0 голосов
/ 02 марта 2019

Допустим, у меня в 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 голосов
/ 02 марта 2019

Хотя лексикографически не отсортировано, следующий код будет печатать все перестановки элементов 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);
}

Используя алгоритм звонка, я генерирую все перестановки символовв исходной строке , включая нулевой терминатор .Затем я выпекаю условие, которое печатает и прерывает текущую перестановку при прохождении нулевого терминатора, чтобы предотвратить печать дубликатов того же подмножества исходных символов.

...