843. 猜猜这个单词

2022/02/28 leetcode 共 1541 字,约 5 分钟

title

problem link

这是一个 *交互式问题* 。

我们给出了一个由一些 不同的 单词组成的列表 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 <= 100
  • wordlist[i].length == 6
  • wordlist[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

Search

    Table of Contents