【问题标题】:How to generate unique combinations of the alphabet up to length 6?如何生成长度为 6 的唯一字母组合?
【发布时间】:2022-01-04 16:16:35
【问题描述】:

我正在创建一个简单的程序,以查看哪种字母组合为 NY Times Spelling Bee 拼图生成了最可能的单词。到目前为止,我拥有的是一个包含 80,000 多个单词的文本文件和下面的代码,它天真地选择了所需的字符,然后生成了 6 个字符的随机组合。然后我编译我的模式并针对已知单词的集合进行测试。此方案需要优化,因为有 26^7 种组合需要测试。

此解决方案可以通过以下几种方式进行优化:

  • 不要重新生成相似或包含重复字母的可选字符数组。 “abcdef”与“fedcba”的结果相同。同样,“aaabcd”不会有像“abcdef”那么多的解决方案,因为所有字母都可以重复使用。
  • 不要生成包含所需字符的可选字符数组。可选字符数组中的点最适合用于在解决方案中引入新字符。
  • 还有什么我想不到的?
int numMaxSolutions = 0;
char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray();
for (char keyChar : alphabet) {
  for (char a : alphabet) {
  for (char b : alphabet) {
  for (char c : alphabet) {
  for (char d : alphabet) {
  for (char e : alphabet) {
  for (char f : alphabet) {
    char[] optionalChars = new char[]{a,b,c,d,e,f};
    Pattern pattern = this.constructPattern(keyChar, optionalChars);
    List<String> results = new ArrayList<String>();
    for (String word : words) {
      if (word.length() >= this.minLength && pattern.matcher(word).matches()) {
        results.add(word);
      }
    }
    if (results.size() > numMaxSolutions) {
      numMaxSolutions = results.size();
      System.out.println(String.format("Max: %c-%s (%d)", keyChar, String.valueOf(optionalChars), numMaxSolutions));
    }
  }
  }
  }
  }
  }
  }
}

我怎样才能实现前两个?

【问题讨论】:

  • 能否请您发布constructPattern() 的列表?看来您根本不需要任何模式匹配。简单的字符串比较就可以了。如果可能,应避免模式匹配是一项代价高昂的操作。
  • 我的印象是模式的编译是一个昂贵的步骤,但检查匹配的成本很低。该函数返回一个正则表达式,如“^[abc]+c[abc]+$”,其中 a 和 b 是可选的,c 是必需的。

标签: java algorithm performance


【解决方案1】:

我会反其道而行之,而是循环遍历已知单词列表。

例如在伪代码中:

Map<String,Integer> combination2Count = new HashMap<>();
for (word in list){
  String sortedCharacters = sortCharactersAlphabetically(word);
  combination2Count.put(sortedCharacters, current count + 1);
}

现在您搜索计数最高的条目。这为您提供了字符与最有效单词的组合。

如果您还需要单词,可以将映射调整为 Map&lt;String,List&lt;String&gt;&gt;,其中 List&lt;String&gt; 包含该字符组合的单词。

【讨论】:

  • 这绝对是更好的方向。迭代次数是已知的——文件中的单词数。
  • 太棒了!谢谢你。稍后我将使用此方法并报告结果。
猜你喜欢
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 2015-07-29
  • 2017-01-14
  • 2017-06-17
  • 1970-01-01
相关资源
最近更新 更多