我正在創建一個簡單的程式,以查看哪種字母組合為紐約時報拼字游戲生成最可能的單詞。到目前為止,我擁有的是一個包含 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));
}
}
}
}
}
}
}
}
我怎樣才能達到前兩個?
uj5u.com熱心網友回復:
我會為此采取相反的方式,而是回圈遍歷已知單詞串列。
例如在偽代碼中:
Map<String,Integer> combination2Count = new HashMap<>();
for (word in list){
String sortedCharacters = sortCharactersAlphabetically(word);
combination2Count.put(sortedCharacters, current count 1);
}
現在您搜索具有最高計數的條目。這為您提供了字符與最有效單詞的組合。
如果您還需要單詞,您可以將映射調整Map<String,List<String>>為List<String>包含該字符組合的單詞的位置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/367616.html
