制作不同字长的单词表?

时间:2011-04-28 22:01:06

标签: algorithm language-agnostic for-loop

我想创建不同字长的单词表。我的src for ...

长度= 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);

如何改进此代码以使其与实际字符串长度无关?

4 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:2)

请注意,以下方法效率很低。通过使用使用字符串构建器的辅助方法可以提高效率,然后在完成后在主方法中完成字符串。

无论如何,递归是处理此问题的最佳方法。

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

答案 2 :(得分: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);

然后你就走了。如果你想要将所有字符串包含到所需的长度,这是一个简单的调整 - 只需将字符串添加到字典中,但只有在当前深度大于零时才递归。

希望这有帮助!

答案 3 :(得分:0)

如果我没有完全错,那么你要做的就是生成所有可能的长度为<=N的字符串。

最简单的方法是将其映射到生成数字的方式,即将数字加1以获得下一个数字。所以基本上从"a"开始,然后在其中添加1以获取"b",依此类推,直至"z"。现在向此处添加1将导致结转,因此生成"aa"然后生成"ba",直到"za"为止"ab"

如果您可以将自然数映射到字符串,则可以极大地简化此操作。要获取字符串,请执行以下操作:

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
    }
}

我希望这会对你有所帮助。