优化仿WORDLE类游戏TERMO的字母校验算法:解决黄色标记错误并提升效率
优化仿WORDLE类游戏TERMO的字母校验算法:解决黄色标记错误并提升效率
嘿,我完全懂你在做TERMO这款葡萄牙版WORDLE时遇到的头疼问题——重复字母的黄色标记真的很容易出bug,就像你举的MOLDO和OMODO这个例子,第三个O明明不该标黄色,但当前代码却错标了对吧?
先聊聊你现有代码的问题:你嵌套循环的逻辑没考虑到字符的“使用次数限制”。原词里的O一共只有2个,一个被第五位的绿色O用掉,另一个被第一位的黄色O占用,剩下的第三个O根本没有多余的O可以匹配,但你的代码没追踪这个使用情况,所以错误地给它标了黄色。
给你一个更高效也更清晰的解决方案,不需要嵌套循环,用字符计数+两次线性遍历就能搞定,时间复杂度是O(n)(这里n固定是5,效率提升明显):
核心思路
- 先处理绿色匹配:先把位置完全对应的字符标记为绿色,同时统计原词中每个字符的剩余可用数量(因为绿色匹配已经用掉了一个字符)。
- 再处理黄色匹配:遍历每个非绿色的字符,只有当原词中还有剩余的该字符时,才标记为黄色,同时减少对应字符的剩余计数。
修正后的代码实现
string checkWord(string word, string selectedWord) { // 0: 绿色, 1: 黄色, 2: 正常 string result(5, '2'); int charCount[26] = {0}; // 第一步:统计目标单词的字符总数,同时处理绿色匹配 for (int i = 0; i < 5; ++i) { charCount[selectedWord[i] - 'A']++; if (word[i] == selectedWord[i]) { result[i] = '0'; charCount[word[i] - 'A']--; // 绿色匹配消耗了一个字符 } } // 第二步:处理黄色匹配,仅针对剩余未被占用的字符 for (int i = 0; i < 5; ++i) { if (result[i] != '0') { // 跳过已经是绿色的字符 char currentChar = word[i]; if (charCount[currentChar - 'A'] > 0) { result[i] = '1'; charCount[currentChar - 'A']--; // 黄色匹配消耗一个剩余字符 } } } return result; }
针对你的示例验证
我们用你给的selectedWord = "MOLDO"和word = "OMODO"来走一遍流程:
- 初始字符计数:M:1, O:2, L:1, D:1
- 绿色匹配处理:第3位D和第4位O匹配成功,标记为绿色;同时D的计数减到0,O的计数减到1
- 黄色匹配处理:
- 第0位O:剩余O计数为1>0,标记黄色,O计数减到0
- 第1位M:剩余M计数为1>0,标记黄色,M计数减到0
- 第2位O:剩余O计数为0,保持正常
- 最终结果:
1 1 2 0 0,对应你想要的O(yellow) M(yellow) O(normal) D(green) O(green)
这个方法不仅解决了重复字符的黄色标记错误,还彻底避免了嵌套循环,逻辑更直观,也更容易维护。
备注:内容来源于stack exchange,提问作者Ian Aragão
相关产品推荐
相关产品推荐

