java - 如何管理 Wordle Game (JavaFx) 中的重复字母?

标签 java algorithm

在我的算法中将 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/

相关文章:

java - 在 Java 中使用 SAX 解析器时出现堆栈溢出错误

java - 在单向链表中删除作为参数传入的对象之前的元素

c++ - 有效地计算多维数组的累加和?

java - 为什么当我们对添加到 JScrollPane 的 JPanel 使用 setPreferredSize 时它会向 JScrollPane 显示滚动条

java - 没有布局的按钮展开

java - 如何在 Java 中不进行替换

algorithm - 根据维基百科,为什么冒泡排序的总空间复杂度是 O(1)?

algorithm - 数学、圆、内点和密度

java - Resty - IllegalArgumentException 与 | URL 中的字符

java - IntelliJ 没有看到我的 OpenGL 版本