You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wordle克隆版开发中重复字母校验异常的高效修复方法

问题原因

你的现有逻辑有两个核心bug:

  1. 循环内直接return状态,只会返回第一个字符的校验结果,根本没完成5个字符的全量校验
  2. 没有处理重复字母的匹配配额,只要检测到字母存在于答案中就判定匹配,没有排除已经被「位置正确(green)」匹配占用的字母份额,才会出现重复字母多判yellow的错误。

Wordle官方的重复字母判定规则本质是字母配额制:答案中每个字母的出现次数就是该字母能拿到green/yellow标识的总上限,配额用完后,后续输入里重复出现的同款字母一律判为grey。

高效修复方案

采用两轮遍历的逻辑即可,时间复杂度O(n)(n固定为5,性能完全无压力),可以覆盖所有边界场景:

  1. 第一轮遍历:优先处理所有位置完全匹配的场景
    • 初始化长度为5的结果数组,默认值填充为grey
    • 初始化一个字母计数对象,统计答案中每个字母的剩余可匹配数量
    • 遍历每个索引位置,如果当前输入字母和答案同位置字母完全一致:
      • 对应结果位置标记为green
      • 把该字母的剩余可匹配计数减1(相当于占用了一个匹配配额)
  2. 第二轮遍历:处理非green位置的yellow判定
    • 遍历所有还没被标记为green的位置:
      • 如果当前输入字母在剩余计数里的值大于0:对应结果位置标记为yellow,同时把该字母剩余计数减1
      • 否则保持grey即可
修复后可直接运行的代码
function checkWord(input, correctWord) {
    const inputUpper = input.toUpperCase();
    const answerUpper = correctWord.toUpperCase();
    const result = new Array(5).fill('grey');
    // 初始化答案字母的可匹配配额计数
    const charCount = {};
    for (const c of answerUpper) {
        charCount[c] = (charCount[c] || 0) + 1;
    }

    // 第一轮:优先标记所有位置完全匹配的green
    for (let i = 0; i < 5; i++) {
        const currentChar = inputUpper[i];
        if (answerUpper[i] === currentChar) {
            result[i] = 'green';
            charCount[currentChar]--;
        }
    }

    // 第二轮:标记剩余位置的yellow
    for (let i = 0; i < 5; i++) {
        // 已经标记为green的位置直接跳过
        if (result[i] === 'green') continue;
        const currentChar = inputUpper[i];
        if (charCount[currentChar] > 0) {
            result[i] = 'yellow';
            charCount[currentChar]--;
        }
    }

    return result;
}
效果验证

以你提到的正确答案CODES、输入包含两个E且靠后的E位置正确的场景为例:

  • 第一轮遍历会先把位置正确的E标记为green,E的剩余配额从1减为0
  • 第二轮遍历到位置错误的第一个E时,E的剩余配额为0,直接判定为grey,完全符合官方规则。
    测试时可以直接调用checkWord(输入单词, 正确单词)查看返回的状态数组即可,也可以自行在控制台自定义正确单词做边界测试。

内容的提问来源于stack exchange,提问作者rohan1122

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 09:54:22