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

优化仿WORDLE类游戏TERMO的字母校验算法:解决黄色标记错误并提升效率

优化仿WORDLE类游戏TERMO的字母校验算法:解决黄色标记错误并提升效率

嘿,我完全懂你在做TERMO这款葡萄牙版WORDLE时遇到的头疼问题——重复字母的黄色标记真的很容易出bug,就像你举的MOLDO和OMODO这个例子,第三个O明明不该标黄色,但当前代码却错标了对吧?

先聊聊你现有代码的问题:你嵌套循环的逻辑没考虑到字符的“使用次数限制”。原词里的O一共只有2个,一个被第五位的绿色O用掉,另一个被第一位的黄色O占用,剩下的第三个O根本没有多余的O可以匹配,但你的代码没追踪这个使用情况,所以错误地给它标了黄色。

给你一个更高效也更清晰的解决方案,不需要嵌套循环,用字符计数+两次线性遍历就能搞定,时间复杂度是O(n)(这里n固定是5,效率提升明显):

核心思路

  1. 先处理绿色匹配:先把位置完全对应的字符标记为绿色,同时统计原词中每个字符的剩余可用数量(因为绿色匹配已经用掉了一个字符)。
  2. 再处理黄色匹配:遍历每个非绿色的字符,只有当原词中还有剩余的该字符时,才标记为黄色,同时减少对应字符的剩余计数。

修正后的代码实现

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"来走一遍流程:

  1. 初始字符计数:M:1, O:2, L:1, D:1
  2. 绿色匹配处理:第3位D和第4位O匹配成功,标记为绿色;同时D的计数减到0,O的计数减到1
  3. 黄色匹配处理:
    • 第0位O:剩余O计数为1>0,标记黄色,O计数减到0
    • 第1位M:剩余M计数为1>0,标记黄色,M计数减到0
    • 第2位O:剩余O计数为0,保持正常
  4. 最终结果:1 1 2 0 0,对应你想要的O(yellow) M(yellow) O(normal) D(green) O(green)

这个方法不仅解决了重复字符的黄色标记错误,还彻底避免了嵌套循环,逻辑更直观,也更容易维护。

备注:内容来源于stack exchange,提问作者Ian Aragão

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 14:33:09