이 문제는 본질적으로 O (N!) (계승) 복잡성 문제입니다. 그 이유는 각 잠재적 단어의 각 위치마다 위치를 채울 수있는 문자의 감소 가능성이 있기 때문입니다. 예를 들어 a, b, c 및 d 4자를 사용할 수 있습니다.
4 * 3 * 2 * 1 = 4!
것은이 될 수
-----------------
Positions: | 0 | 1 | 2 | 3 |
-----------------
In position 0, there are 4 possibilities, a, b, c, or d
Lets fill with a
-----------------
String: | a | | | |
-----------------
Now Position 1 has 3 possibilities of fill letters b, c, or d
Lets fill with b
-----------------
String: | a | b | | |
-----------------
Now Position 2 has 2 possibilities of fill letters c, or d
Lets fill with c
-----------------
String: | a | b | c | |
-----------------
Now Position 1 has only 1 possibility for a fill letter: d
-----------------
String: | a | b | c | d |
-----------------
에만 1 문자열위한 복잡성 때문에, 소정의 출력 단어의 문자 위치를 채울 수있는 잠재적 인 가능성 (이 경우)로부터 온다 입력 문자의 어떤 금액으로 확장하고 정확하게 N입니다! 반복 문자가없는 경우. 이것은 또한 귀하가 결과로 가져야하는 단어의 금액을 나타냅니다.
projectName abc
샘플 출력을 "ABC"
를 사용 :
코드는이 (테스트 일하는 C) 할 수 같은 것을 수행하기 위해 다음과 같이
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
void printPermutations(int level, const char * inString, char * outString){
unsigned int len = strlen(inString);
char * unusedLetter;
int j;
if(1 == len){
printf("%s%s\n", outString, inString);
}else{
unusedLetters = (char *)malloc(sizeof(char) * (len - 1));
for(int startLetter = 0; startLetter < len; startLetter++){
outString[level] = inString[startLetter];
// setup the "rest of string" string
j = 0;
for(int i = 0; i < len; i++){
if(i != startLetter){
unusedLetter[j] = inString[i];
j++;
}
}
// recursive call to THIS routine
printPermutations(level+1, unusedLetters, outString);
}
}
}
int main(int argc, char * argv[]){
unsigned int len;
char * outString;
if(argc != 2) return 0;
len = strlen(argv[1]);
outString = (char *)malloc(sizeof(char) * (len + 1));
outstring[len] = '\0';
printPermutations(0, argv[1], outString);
return 0;
}
을 외부에서이 전화
abc
acb
bac
bca
cab
cba
반복되는 문자가 있으면 a, a, b, c라고 말하십시오.
다음 반복 단어가 항상있을 것입니다.
이러한 경우 UNIQUE 결과 단어의 양은 고유 한 문자의 계승 값이어야합니다. 위의 경우 3입니다. 4!가 아닙니다.
이유는 a가 주어진 지점을 채우는 것이 중요하지 않으므로 제공되는 고유 한 문자의 양이 유일성이라는 것입니다. 이것은 또한 어려운 문제이며 모든면에서 N을 생성해야한다고 말합니다. 단어를 먼저 찾은 다음 두 번째 알고리즘을 실행하여 반복 단어를 검색하고 삭제합니다. 즉석에서 고유 한 단어를 생성하는 더 똑똑한 방법이있을 수 있습니다. .
코드는 세 글자 단어에만 작동합니다. 여분의 루프를 추가하지 않고도 네 글자로 된 단어를 만들 수는 없습니다. 그것은 당신이 보았던 "다른 알고리즘"의 모든 추가적인 복잡성을 설명해야합니다. – dasblinkenlight
이 질문에 공통적 인 변형이 있으므로 다른 유사한 질문이나 답변을 의미합니까? – Rndm
예를 들어'otp'와'tpo'가 빠진 경우'pot '이 세 번 주어집니다. 코드를 검사하지는 않았지만, 결과가 문자열이고 문자열의 모든 순열을 생성한다는 것은 잘못된 것일 수 있습니다. – Wolfram