java 所有可能的词

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5504008/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 11:26:43  来源:igfitidea点击:

All possible words

javaalgorithmlogic

提问by AutoMEta

I want to create all possible 5 letter words using a-z.Please suggest any good and fast algorithms.

我想使用 az 创建所有可能的 5 个字母的单词。请建议任何好的和快速的算法。

I have tried creating one and it looks something like this...

我试过创建一个,它看起来像这样......

     byte[] allchar=new byte[] {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
 int lengthOfAllChar=allchar.length;
         System.out.println(lengthOfAllChar);
        for (int i = 0; i < lengthOfAllChar; i++){
            for(int j = 0; i < lengthOfAllChar; j++){
                StringBuffer finalWordBuffer = new StringBuffer();
                finalWordBuffer.append((char)allchar[i]);
                finalWordBuffer.append((char)allchar[j]);
            }
        }

回答by WhiteFang34

Here's an example of generating all sequences for any set of characters at any length:

这是为任何长度的任何字符集生成所有序列的示例:

public class WordPermutations {
    public static void main(String[] args) {
        char[] chars = "abcdefghijklmnopqrstuvwxyz".toCharArray();
        int len = 5;
        iterate(chars, len, new char[len], 0);
    }

    public static void iterate(char[] chars, int len, char[] build, int pos) {
        if (pos == len) {
            String word = new String(build);
            // do what you need with each word here
            return;
        }

        for (int i = 0; i < chars.length; i++) {
            build[pos] = chars[i];
            iterate(chars, len, build, pos + 1);
        }
    }
}

This takes about 250ms on my machine to iterate through all 11,881,376 sequences.

这在我的机器上大约需要 250 毫秒来遍历所有 11,881,376 个序列。

Note that a new char[len]is only created once at the beginning and reused as build for building the permutations. The first call to iterate()starts with a posof 0. Skip down to the for loop where it loops through each of chars. The first char of build is set to that and then we recursively call the same method to set the next one at pos + 1. Once this has happened 5 times the pos will be at len. This is when the pos == lenkicks in at the top of the method. Then it just builds a Stringfrom what's built up in build and there's your word.

请注意,新char[len]的仅在开始时创建一次并作为构建重用以构建排列。第一次调用以iterate()a posof开头0。跳到 for 循环,它循环遍历每个字符。build 的第一个字符设置为那个,然后我们递归调用相同的方法将下一个设置为pos + 1。一旦这种情况发生了 5 次,则 pos 将位于len。这是在pos == len方法的顶部开始的时候。然后它只是String从构建中构建的构建一个,这就是你的话。

回答by Antti Huima

This can be done easily also without recursion (here in C)

这也可以轻松完成,无需递归(此处为 C)

int i, k, n;
char tmp[6]; tmp[5] = 0;
for (i=0;i<26*26*26*26*26;i++) {
   n = i;
   for (k=4;k>=0;k--){
      tmp[k] = 'a' + (n % 26); 
      n /= 26;
   }
   output_string(tmp);
}

or you can do it with carry:

或者你可以用carry来做:

char tmp[6]; int i, k;
strcpy(tmp, "aaaaa");
for (i=0;i<26*26*26*26*26;i++) {
   output_string(tmp);
   tmp[4]++;
   k = 4;
   while (k > 0 && tmp[k] == 'z') { tmp[k] = 'a'; k--; tmp[k]++; }
}

回答by David M. Coe

public static List<String> getAll(int length) {
    final char[] chars = "0123456789".toCharArray();
    final double NUMBER_OF_PERMUTATIONS = Math.pow(chars.length, length);

    List<String> words = new ArrayList<>(Double.valueOf(
            NUMBER_OF_PERMUTATIONS).intValue());

    char[] temp = new char[length];
    Arrays.fill(temp, '0');

    for (int i = 0; i < NUMBER_OF_PERMUTATIONS; i++) {
        int n = i;
        for (int k = 0; k < length; k++) {
            temp[k] = chars[n % chars.length];
            n /= chars.length;
        }
        words.add(String.valueOf(temp));
    }
    return words;
}  

Here is the Java 7 version of antti.huima's code.

这是 antti.huima 代码的 Java 7 版本。

回答by v1ewb0x

public void wordCreator(int length){
    Random rnd=new Random();
    String word;
    do{
        word="";
        for(int j=0; j<length; j++){
            int index=rnd.nextInt(data.length);   //data is a String array letter of the alpabet
            word+=data[index];
        }
    }while(wordMap.containsValue(word));
    wordMap.put(i, word);
    i++;

}

}

Here is your algorithm

这是你的算法

回答by CanSpice

Here's an algorithm for you to try out, in pseudocode:

这里有一个算法供您尝试,用伪代码表示:

array seenWords;
while size of seenWords[] < 26^5:
  generate random string of length 5 letters
  is string in seenWords?
  yes:
    go back to while
  no:
    push string onto end of seenWords[]
done while

You should be able to easily translate this pseudocode into proper Java code. The only tricky bit is generating the random string. You could take your array of letters, pick a random value between 1 and 26, then use that for a letter. Repeat that five times and you have a five-letter string!

您应该能够轻松地将此伪代码转换为正确的 Java 代码。唯一棘手的一点是生成随机字符串。您可以使用字母数组,在 1 到 26 之间随机选择一个值,然后将其用作字母。重复五次,你就有了一个五个字母的字符串!

Whether or not this is a "good" or "fast" algorithm is up to you. You haven't defined what "good" or "fast" mean, so I'm unable to judge. You may have different criteria than I do.

这是否是“好”或“快速”算法取决于您。你还没有定义“好”或“快”是什么意思,所以我无法判断。你的标准可能与我不同。

Note that this will generate all strings that have five letters in them. These will probably not be words. Judging from your sample code you want all strings that have five letters in them, not words that have five letters in them.

请注意,这将生成所有包含五个字母的字符串。这些可能不是文字。从您的示例代码来看,您需要所有包含五个字母的字符串,而不是包含五个字母的单词。