【发布时间】: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