在我的算法中将 secret 单词与猜测的单词进行比较,我需要管理重复的字母。例如,
如果 secret 单词是newly
并且猜测的单词是newer
,则输出应该是“GGGWW”(G = green(正确位置),W = 白色(字母不在 secret 单词中)),
但我的算法在下面输出“GGGYW”(Y = 黄色(字母在单词中但不在正确的位置))。
for (int i = 0; i < 5; i++) {
if (secret.charAt(i) == prop.charAt(i)) {
status[i] = LetterStatus.IN;
} else if (secret.contains(Character.toString(prop.charAt(i)))) {
status[i] = LetterStatus.OK;
} else {
status[i] = LetterStatus.NOTIN;
}
}
return status;
secret = Secretword,数组状态是(IN, OK, NOTIN)
的枚举,因此字母和 Prop 状态是猜测的单词。
关于如何修改此代码来解决我的问题的任何想法
最佳答案
您必须考虑出现的次数。因此,首先处理精确匹配,记录到目前为止未找到的字母。对于猜测中出现的每一个字母,从记录的字母中删除该字母,这样就不会再次匹配它。例如
ArrayList<Character> missing = new ArrayList<>();
for(int i = 0; i < 5; i++) {
if(secret.charAt(i) == prop.charAt(i)) {
status[i] = LetterStatus.IN;
}
else missing.add(secret.charAt(i));
}
if(!missing.isEmpty()) {
for(int i = 0; i < 5; i++) {
if(secret.charAt(i) != prop.charAt(i)) {
Object ch = prop.charAt(i); // ensure to use remove(Object) not remove(int)
status[i] = missing.remove(ch)? LetterStatus.OK: LetterStatus.NOTIN;
}
}
}
对于大数据,您可以使用类似 Map<Character,Integer>
的内容记录每个元素出现的次数,但由于这里最多有五个元素,因此使用 ArrayList
更简单,同时提供合理的性能。重要的是要记住,这种方法不会扩展到其他问题。
关于java - 如何管理 Wordle Game (JavaFx) 中的重复字母?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72229545/