1

如何在 java 中创建一个“单词生成器”,它为我提供了 ascii 表范围内所有可能的字符组合,并且具有一定的长度或更少。

到目前为止,我所做的是一团糟,而不是一个好的解决方案。它可以生成一系列字符(在此示例中为 48 到 57)的单词,但它的固定字长为 4。

for (int i = 48; i < 58; i++) {
    for (int j = 48; j < 58; j++) {
        for (int k = 48; k < 58; k++) {
            for (int l = 48; l < 58; l++) {
                String bruteword = "" + (char) i + (char) j + (char) k + (char) l;
            }
        }
    }
}

我希望你们明白我的意思。对不起,我总是很难用英语表达这样的东西。

4

1 回答 1

7

递归在这里可以提供帮助。假设您说这words(min, max, n)会为您提供所有单词的列表,其中包含和n之间的字符。你可以通过说 if 来实现它,唯一的词是空字符串;否则,您将通过将每个可能的字符附加到.minmaxn = 0words(min, max, n - 1)

List<String> words(char min, char max, int n) {
   List<String> ret = new ArrayList<String>();
   if(n == 0) {
      ret.add("");
      return ret;
   }
   for(String word : words(min, max, n - 1)) {
      for(char c = min; c <= max; ++c) {
         ret.add(word + c);
      }
   }
   return ret;
}

编辑:

迭代解决方案也生成小于请求长度的所有可能性:

List<String> words(char min, char max, int n) {
   List<String> ret = new ArrayList<String>();
   ret.add("");
   int start = 0;
   for(int length = 1; length <= n; ++length) {
      int end = ret.size();
      for(int i = 0; i < end; ++i) {
         for(char c = min; c <= max; ++c) {
            ret.add(ret.get(i) + c);
         }
      }
      start = end;
   }
   return ret;
}

编辑:

如果您不想保存单词,则肯定需要递归,因为您基本上是使用堆栈代替列表:

void words(char min, char max, int n) {
   for(int i = 0; i <= n; ++i) {
      wordsRecursive("", min, max, i);
   }
}

void wordsRecursive(String base, char min, char max, int n) {
   if(n == 0) {
      System.out.println(base);
   } else {
      for(char c = min; c <= max; ++c) {
         wordsRecursive(base + c, min, max, n - 1);
      }
   }
}
于 2013-11-12T16:39:06.757 回答