【博弈】843. 猜猜这个单词

本题涉及知识点

博弈

LeetCode843. 猜猜这个单词

给你一个由 不同 字符串组成的单词列表 words ,其中 words[i] 长度均为 6 。words 中的一个单词将被选作秘密单词 secret 。
另给你一个辅助对象 Master ,你可以调用 Master.guess(word) 来猜单词,其中参数 word 长度为 6 且必须是 words 中的字符串。
Master.guess(word) 将会返回如下结果:
如果 word 不是 words 中的字符串,返回 -1 ,或者
一个整数,表示你所猜测的单词 word 与 秘密单词 secret 的准确匹配(值和位置同时匹配)的数目。
每组测试用例都会包含一个参数 allowedGuesses ,其中 allowedGuesses 是你可以调用 Master.guess(word) 的最大次数。
对于每组测试用例,在不超过允许猜测的次数的前提下,你应该调用 Master.guess 来猜出秘密单词。最终,你将会得到以下结果:
如果你调用 Master.guess 的次数大于 allowedGuesses 所限定的次数或者你没有用 Master.guess 猜到秘密单词,则得到 “Either you took too many guesses, or you did not find the secret word.” 。
如果你调用 Master.guess 猜到秘密单词,且调用 Master.guess 的次数小于或等于 allowedGuesses ,则得到 “You guessed the secret word correctly.” 。
生成的测试用例保证你可以利用某种合理的策略(而不是暴力)猜到秘密单词。

示例 1:

输入:secret = “acckzz”, words = [“acckzz”,“ccbazz”,“eiowzz”,“abcczz”], allowedGuesses = 10
输出:You guessed the secret word correctly.
解释:
master.guess(“aaaaaa”) 返回 -1 ,因为 “aaaaaa” 不在 words 中。
master.guess(“acckzz”) 返回 6 ,因为 “acckzz” 是秘密单词 secret ,共有 6 个字母匹配。
master.guess(“ccbazz”) 返回 3 ,因为 “ccbazz” 共有 3 个字母匹配。
master.guess(“eiowzz”) 返回 2 ,因为 “eiowzz” 共有 2 个字母匹配。
master.guess(“abcczz”) 返回 4 ,因为 “abcczz” 共有 4 个字母匹配。
一共调用 5 次 master.guess ,其中一个为秘密单词,所以通过测试用例。
示例 2:

输入:secret = “hamada”, words = [“hamada”,“khaled”], allowedGuesses = 10
输出:You guessed the secret word correctly.
解释:共有 2 个单词,且其中一个为秘密单词,可以通过测试用例。

提示:
1 <= words.length <= 100
words[i].length == 6
words[i] 仅由小写英文字母组成
words 中所有字符串 互不相同
secret 存在于 words 中
10 <= allowedGuesses <= 30

博弈

ctn[i][j] 记录 记录 和 words[i]有j个字符匹配的字符串数量。
ctn2[i] = M a x j : 0 5 c n t [ i ] [ j ] Max_{j:0}^5cnt[i][j] Maxj:05cnt[i][j] 含义是:最坏情况有多少个字符串要排除。
每次选择cnt2[i]最小的字符串。
n = words.length
每次至少排除一个单词,估计最大调用n次。
每次调用的时间复杂度:(6nn) 两两比较字符串的匹配度。
故:总时间复杂度是O(6nnn)。

代码

class Solution {
public:
	void findSecretWord(vector<string>& words, Master& master) {
		const int n = words.size();
		vector<vector<int>> cnt(n, vector<int>(7));
		for (int i = 0; i < n; i++) {
			for (int j = i + 1; j < n; j++) {
				const int same = Same(words[i], words[j]);
				cnt[i][same]++;
				cnt[j][same]++;
			}
		}
		map<int, int> mCntIndex;
		for (int i = 0; i < n; i++) {
			int iMax = cnt[i][0];
			for (int j = 1; j <= 5; j++) {
				iMax = max(iMax, cnt[i][j]);
			}
			mCntIndex[iMax] = i;
		}
		const string strGuess = words[mCntIndex.begin()->second];
		const int iSameAns = master.guess(strGuess);
		if (6 == iSameAns) { return; }
		vector<string> newWords;
		for (const auto& s : words) {
			if (iSameAns == Same(s, strGuess)) {
				newWords.emplace_back(s);
			}
		}
		findSecretWord(newWords, master);
	}
	int Same(const string& s1, const string& s2) {
		int same = 0;
		for (int k = 0; k < 6; k++) {
			same += (s1[k] == s2[k]);
		}
		return same;
	}
};

扩展阅读

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关推荐

我想对大家说的话
喜缺全书算法册》以原理、正确性证明、总结为主。
按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

相关推荐

  1. 博弈游戏】

    2024-06-19 08:38:02       8 阅读
  2. leetcode - 843. Guess the Word

    2024-06-19 08:38:02       18 阅读
  3. 为什么单线程的redis的效率这么高?

    2024-06-19 08:38:02       12 阅读
  4. 【Redis】为什么是单线程?为什么这么快呢?

    2024-06-19 08:38:02       7 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-19 08:38:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-19 08:38:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-19 08:38:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-19 08:38:02       18 阅读

热门阅读

  1. 重构与优化-优化函数调用(5)

    2024-06-19 08:38:02       10 阅读
  2. 5.卷积神经网络

    2024-06-19 08:38:02       7 阅读
  3. 医疗图像的校准

    2024-06-19 08:38:02       5 阅读
  4. [python学习]--模块管理

    2024-06-19 08:38:02       9 阅读
  5. 解析方法与几何模型

    2024-06-19 08:38:02       10 阅读
  6. 【Leetcode】最后一个单词的长度

    2024-06-19 08:38:02       8 阅读
  7. sqlalchemy读取日志数据并保存至数据库

    2024-06-19 08:38:02       7 阅读
  8. 经典sql

    经典sql

    2024-06-19 08:38:02      8 阅读
  9. 硬盘的缓存有什么作用

    2024-06-19 08:38:02       7 阅读