2011-04-28 3 views
1

단어 길이가 다른 단어 목록을 만들고 싶습니다. 내 SRC에 대한 ...다른 단어 길이로 단어 목록을 만드시겠습니까?

길이 = 1 :

for(int a=97;a<=122;a++) 
    String foo=String.valueOf((char)a); 

길이 = 2 :

for(int a=97;a<=122;a++) 
    for(int b=97;b<=122;b++) 
     String foo=String.valueOf((char)a+""+(char)b); 

모든 아이디어를 어떻게 실제 문자열 길이와 무관하므로이 코드를 개선하는 방법?

+0

자바처럼 보입니다 ... 맞습니까? – Tejs

+0

네,하지만 그 언어는 차이가 없습니다 – bluezz

+5

그냥 재귀를 사용하고자하는 것처럼 들립니다. 각 깊이에 대해 단어에 다른 문자를 추가합니다. – Tejs

답변

0

Tejs가 제시 하듯이 재귀를 사용하는 것이 좋습니다. 당신은 동적 깊이를 가지고 루프를 쓸 수 없습니다,하지만 당신은 모든 수준 (당신이 스택 공간이 부족 전까지는) 당신이 원하는에 재귀 수 있습니다

//Pseudocode! 
void generate(dictionary, string, depth) 
{ 
    if(depth == 0) 
    { 
     dictionary.add(string); 
    } 
    else 
    { 
     for(char c = 'a'; c <= 'z'; ++c) 
     { 
      generate(dictionary, string + c, depth - 1); 
     } 
    } 
} 

그냥 시작하면 해제와 같은 :

dictionary = new Dictionary; 
generate(dictionary, '', depth); 

당신은 꺼져 있습니다. 모든 문자열 을 원하는 길이 인까지 포함하려면 손쉽게 문자열을 사전에 추가하고 현재 깊이가 0보다 큰 경우에만 반복합니다.

희망이 도움이됩니다.

+0

내가 찾은 것이 그 덕분입니다! – bluezz

3

문자열이 숫자 인 경우 오버플로 될 때까지 하나씩 추가하여 가능한 모든 값을 얻을 수 있습니다.

문자열에 대해 이와 동일한 방법을 사용할 수 있습니다. 각 문자를 숫자로 간주하십시오. 가장 오른쪽에있는 문자 하나를 더한다. 다음 문자를 감싸는 경우 다음 문자를 증가시킵니다.

// for strings of size N 
char *str = malloc(N+1); 
// init 
str[N] = 0; 
for (i=0, i<N, i++) str[i]='a'; 

int done = 0; 
while (!done) 
{ 
    for(i=N-1; i>=0; i--) 
    { 
     str[i] += 1; 
     if (str[i] == 'z'+1) 
     { 
      if (N==0) done = 1; 
      str[i] = 'a'; 
     } 
     else break; 
    } 
    // do something with str 
} 
2

아래의 방법은 상당히 비효율적입니다. stringbuilders를 사용한 보조 메서드를 사용하여보다 효율적으로 만들 수 있으며 완료되면 기본 메서드에서 문자열을 완성 할 수 있습니다.

어떤 경우에도 재귀가이를 처리하는 가장 좋은 방법입니다.

List<String> generate(int len) { 
    if(len == 1) { 
     List<String> strings = new LinkedList<String>(); 
     // notice I'm putting a char here, not an int 
     for(char a=97;a<=122;a++) strings.add(String.valueOf(a)); 
     return strings; 
    } 
    List<String> shortStrings = generate(len - 1); 
    List<String> strings = new LinkedList<String>(); 
    for(String shortString : shortStrings) 
     for(char a=97;a<=122;a++) strings.add(shortString + A); 
    return strings; 
} 
0

만약 내가 완전히 틀리지 않다면, 당신이하려고하는 것은 길이가 <=N 인 가능한 모든 문자열을 생성하는 것입니다.

가장 간단한 방법은 숫자를 생성하는 방식으로 매핑하는 것입니다. 즉 숫자에 1을 더하여 다음 번호를 얻는 것입니다. 따라서 기본적으로 "a"으로 시작한 다음 "b"이되도록 "z"까지 1을 더하십시오. 이제 이것에 1을 더하면 캐리 오버가 발생하므로 이 될 때까지 "za"까지 "aa"을 생성 한 다음 "ba"을 생성하십시오.

자연수를 문자열에 매핑 할 수 있으면이 방법을 크게 단순화 할 수 있습니다. 문자열을 얻으려면 단지이 작업을 수행 :

string getString(int val) { 
    string str = ""; 
    while (val>=0) { 
     int rem = val%26; // as there are 26 characters in english 
     str = str + charToString('a'+rem); 
     val /= 26; 
    } 
    return str; 
} 

지금 바로 문자열을 얻기 위해이 함수를 호출 :

void listStrings(int N) { 
    int max = 26^N-1; 
    string str; 
    for(int i=1; i<=max; ++i) { 
     str = getString(i); 
     doSomething(str); // maybe print it or store in file 
    } 
} 

나는 이것이 당신이 도움이되기를 바랍니다.