title
这是一个 *交互式问题* 。
我们给出了一个由一些 不同的 单词组成的列表 wordlist ,对于每个 wordlist[i] 长度均为 6 ,这个列表中的一个单词将被选作 secret 。
你可以调用 Master.guess(word) 来猜单词。你所猜的单词应当是存在于原列表并且由 6 个小写字母组成的类型 string 。
此函数将会返回一个 integer ,表示你的猜测与秘密单词 secret 的准确匹配(值和位置同时匹配)的数目。此外,如果你的猜测不在给定的单词列表中,它将返回 -1。
对于每个测试用例,你有 10 次机会来猜出这个单词。当所有调用都结束时,如果您对 Master.guess 的调用在 10 次以内,并且至少有一次猜到 secret ,将判定为通过该用例。
示例 1:
输入: secret = "acckzz", wordlist = ["acckzz","ccbazz","eiowzz","abcczz"]
输出: You guessed the secret word correctly.
解释:
master.guess("aaaaaa") 返回 -1, 因为 "aaaaaa" 不在 wordlist 中.
master.guess("acckzz") 返回 6, 因为 "acckzz" 就是秘密,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", wordlist = ["hamada","khaled"], numguesses = 10
输出: You guessed the secret word correctly.
提示:
1 <= wordlist.length <= 100wordlist[i].length == 6wordlist[i]只包含小写英文字母wordlist中所有字符串都 不同secret在wordlist中numguesses == 10
solution
极小化极大,维护可能的可行解列表,不断减少
class Solution:
def findSecretWord(self, wordlist: List[str], master: 'Master') -> None:
'''
先随机选一个单词,调用guess得到匹配的数目a, 则答案肯定是在与该单词匹配的数目也是a的列表,每次循环更新一次列表
'''
match = {}
n = len(wordlist)
for i in range(n):
for j in range(i, n):
count = sum((1 if wordlist[i][k] == wordlist[j][k] else 0) for k in range(len(wordlist[i])))
match[(wordlist[i], wordlist[j])] = count
match[(wordlist[j], wordlist[i])] = count
import random
for _ in range(10):
word = wordlist[random.randint(0, len(wordlist) - 1)]
count = master.guess(word)
if count == 6: return
new_wordlist = []
for v in wordlist:
if match[(word, v)] == count:
new_wordlist.append(v)
wordlist = new_wordlist
return None