【问题标题】:Generate all words using Java使用 Java 生成所有单词
【发布时间】:2010-04-20 07:59:42
【问题描述】:

我想知道如何使用java从指定字符和长度生成所有单词

String first[]={"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"};
String second[]={"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"};
String ch ="";  
String total[];

for(int i = 0;i<26;i++) {
    for(int j = 0;j<26;j++) {
        ch+=first[i]+first[j];
        System.out.println(ch);
    }
}

我只通过这个程序只得到 576 个单词,但是 26 个!字数为 4.03291461 × 10^26

如何用java编写程序?

【问题讨论】:

  • 没有作业的味道吗?如果是,请相应地标记您的消息。
  • 您的程序会打印出每个可能的 2 个字母的单词。
  • 是的,我的问题是我的程序显示不正确......我想要下面的 aa ab 。 . . az aac . aaz 然后 ba 。 . bz等等

标签: java string


【解决方案1】:
public class Words {
    static char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray();

    static void generate(StringBuilder sb, int n) {
        if (n == sb.length()) {
            System.out.println(sb.toString());
            return;
        }
        for (char letter : alphabet) {
            sb.setCharAt(n, letter);
            generate(sb, n + 1);
        }
    }
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        for (int length = 2; length <= 5; length++) {
            sb.setLength(length);
            generate(sb, 0);
        }
    }
}

这会生成所有 2 个字母、3 个字母、4 个字母和 5 个字母的“单词”。它使用标准的递归算法。

另见


从更数学的角度来看,人们经常混淆术语“排列”的含义。是的,有26个! a-z 的 26 个字母的排列 - 这是 A LOT 的字符串,但这不包括 aa, ab 等。它包括 26 个字母每个仅出现一次的所有字符串。

【讨论】:

    【解决方案2】:

    考虑一下你在做什么: 您将遍历第一个数组一次,并在该循环的每次迭代中遍历第二个数组。 这将产生总共 26^2 个结果,或 676 个(而不是 576 个)。 而且您构建输出的方式非常具体,检查您得到的结果,您会发现其中有一个非常明确的模式。

    当然,第二个数组根本不用,所以完全是多余的。

    解决方案是在纸上写下如果您手动尝试,您将如何进行,然后尝试将其转换为代码。 对于一个人来说,您不希望只有特定长度的单词(您会得到)或特定的字母模式(您也会得到)。

    【讨论】:

    • 好提示(不泄露答案)。
    【解决方案3】:

    但是 26 !字数为 4.03291461 × 1026

    如何用java编写程序

    不要用 Java 或任何其他语言编写该程序。这将毫无意义,因为它实际上需要数十亿年才能完成。

    但是对于您在 cmets 中的预期结果,该数字也完全错误。 26!是排列的数量,即对 26 个元素 重复进行排序的不同方式。字数为 26^n,其中 n 为长度。

    【讨论】:

    • +1。我仍然很困惑 OP 怎么能这么实事求是地说“只有这么多,而不是 [一个天文数字]”。他想产生比宇宙中的星星更多的弦。
    • 还有巨大的空间。 ~2.3 GB 用于所有 4 长度的小字符单词。
    【解决方案4】:

    这是我的解决方案。这有点快,所以不要太在意优化。

    public static void printWords(int length) {
    
        if (length < 1)
            throw new IllegalArgumentException();
    
        printWordsRec("", length);
    }
    
    private static void printWordsRec(String base, int length) {
    
        for (char c = 'a'; c <= 'z'; c++) {
            if (length == 1) {
                System.out.println(base + c);
            }
            else {
                printWordsRec(base + c, length - 1);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 2011-06-24
      • 2015-09-25
      相关资源
      最近更新 更多