Wordle克隆版开发中重复字母校验异常的高效修复方法
问题原因
你的现有逻辑有两个核心bug:
- 循环内直接return状态,只会返回第一个字符的校验结果,根本没完成5个字符的全量校验
- 没有处理重复字母的匹配配额,只要检测到字母存在于答案中就判定匹配,没有排除已经被「位置正确(green)」匹配占用的字母份额,才会出现重复字母多判yellow的错误。
Wordle官方的重复字母判定规则本质是字母配额制:答案中每个字母的出现次数就是该字母能拿到green/yellow标识的总上限,配额用完后,后续输入里重复出现的同款字母一律判为grey。
高效修复方案
采用两轮遍历的逻辑即可,时间复杂度O(n)(n固定为5,性能完全无压力),可以覆盖所有边界场景:
- 第一轮遍历:优先处理所有位置完全匹配的场景
- 初始化长度为5的结果数组,默认值填充为grey
- 初始化一个字母计数对象,统计答案中每个字母的剩余可匹配数量
- 遍历每个索引位置,如果当前输入字母和答案同位置字母完全一致:
- 对应结果位置标记为green
- 把该字母的剩余可匹配计数减1(相当于占用了一个匹配配额)
- 第二轮遍历:处理非green位置的yellow判定
- 遍历所有还没被标记为green的位置:
- 如果当前输入字母在剩余计数里的值大于0:对应结果位置标记为yellow,同时把该字母剩余计数减1
- 否则保持grey即可
- 遍历所有还没被标记为green的位置:
修复后可直接运行的代码
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
相关产品推荐
相关产品推荐

