배열에 문자열이 거의 없다고 가정합니다. 우리는 다른 줄에서 이들의 모든 순열을 찾아야 합니다.
따라서 입력이 string =["abc", "def", "ghi"]와 같으면 출력은
abc def ghi abc ghi def def abc ghi def ghi abc ghi abc def ghi def abc
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- next_permutation() 함수를 정의하면 n, 문자열 배열 s가 필요합니다.
- i를 초기화하려면:=n - 1, i> 0일 때 업데이트(i를 1만큼 감소), 다음을 수행합니다.
- s[i]> s[i - 1])인 경우:
- j :=나는 + 1
- j
- s[j] <=s[i - 1])인 경우:
- 루프에서 빠져나오기
- t :=s[i - 1]
- s[j] <=s[i - 1])인 경우:
- s[i]> s[i - 1])인 경우:
- s[i - 1] =s[j - 1]
- s[j - 1] =t
- i
- t :=s[i]
- s[i] :=s[n - 1]
- s[n - 1] =t
- 초기화 i의 경우:=0, i
- 디스플레이 문자열[i] then (i가 n - 1과 같으면 다음 줄로 이동, 그렇지 않으면 공백 인쇄
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <stdio.h> #include <string.h> int next_permutation(int n, char **s){ for (int i = n - 1; i > 0; i--) if (strcmp(s[i], s[i - 1]) > 0){ int j = i + 1; for (; j < n; j++) if (strcmp(s[j], s[i - 1]) <= 0) break; char *t = s[i - 1]; s[i - 1] = s[j - 1]; s[j - 1] = t; for (; i < n - 1; i++, n--){ t = s[i]; s[i] = s[n - 1]; s[n - 1] = t; } return 1; } for (int i = 0; i < n - 1; i++, n--){ char *t = s[i]; s[i] = s[n - 1]; s[n - 1] = t; } return 0; } int main(){ char *strings[] = {"abc", "def", "ghi"}; int n = 3; do{ for (int i = 0; i < n; i++) printf("%s%c", strings[i], i == n - 1 ? '\n' : ' '); } while (next_permutation(n, strings)); }
입력
{"abc", "def", "ghi"}
출력
abc def ghi abc ghi def def abc ghi def ghi abc ghi abc def ghi def abc