博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] 843. Guess the Word 猜单词
阅读量:4630 次
发布时间:2019-06-09

本文共 7353 字,大约阅读时间需要 24 分钟。

This problem is an interactive problem new to the LeetCode platform.

We are given a word list of unique words, each word is 6 letters long, and one word in this list is chosen as secret.

You may call master.guess(word) to guess a word.  The guessed word should have type string and must be from the original list with 6 lowercase letters.

This function returns an integer type, representing the number of exact matches (value and position) of your guess to the secret word.  Also, if your guess is not in the given wordlist, it will return -1 instead.

For each test case, you have 10 guesses to guess the word. At the end of any number of calls, if you have made 10 or less calls to master.guess and at least one of these guesses was the secret, you pass the testcase.

Besides the example test case below, there will be 5 additional test cases, each with 100 words in the word list.  The letters of each word in those testcases were chosen independently at random from 'a' to 'z', such that every word in the given word lists is unique.

Example 1:Input: secret = "acckzz", wordlist = ["acckzz","ccbazz","eiowzz","abcczz"]Explanation:master.guess("aaaaaa") returns -1, because "aaaaaa" is not in wordlist.master.guess("acckzz") returns 6, because "acckzz" is secret and has all 6 matches.master.guess("ccbazz") returns 3, because "ccbazz" has 3 matches.master.guess("eiowzz") returns 2, because "eiowzz" has 2 matches.master.guess("abcczz") returns 4, because "abcczz" has 4 matches.We made 5 calls to master.guess and one of them was the secret, so we pass the test case.

Note:  Any solutions that attempt to circumvent the judge will result in disqualification.

这是一个Leetcode平台新型的交互式问题

给定一个不重复的词表,里面都是只有6个小写字母的单词。然后,系统会随机选定一个单词作为 "secret"

你可以调用系统提供的API master.guess(word) 来查询word 是否就是 "secret"。

这个API返回的参数是个整型,表示查询的匹配程度。

对于每个测试用例,你有10次查询机会。如果你能在10次以内的查询中找出 "secret" 则判定你通过用例。

任何绕过判定的做法都会被视为非法。

解法:Random Guess and Minimax Guess with Comparison

Java:

public void findSecretWord(String[] wordlist, Master master) {        for (int i = 0, x = 0; i < 10 && x < 6; ++i) {            HashMap
count = new HashMap<>(); for (String w1 : wordlist) for (String w2 : wordlist) if (match(w1, w2) == 0) count.put(w1, count.getOrDefault(w1 , 0) + 1); Pair
minimax = new Pair<>("", 1000); for (String w : wordlist) if (count.getOrDefault(w, 0) < minimax.getValue()) minimax = new Pair<>(w, count.getOrDefault(w, 0)); x = master.guess(minimax.getKey()); List
wordlist2 = new ArrayList
(); for (String w : wordlist) if (match(minimax.getKey(), w) == x) wordlist2.add(w); wordlist = wordlist2.toArray(new String[0]); } }  

Python:

# Time:  O(n^2)# Space: O(n)import collectionsimport itertoolsclass Solution(object):    def findSecretWord(self, wordlist, master):        """        :type wordlist: List[Str]        :type master: Master        :rtype: None        """        def solve(H, possible):            min_max_group, best_guess = possible, None            for guess in possible:                groups = [[] for _ in xrange(7)]                for j in possible:                    if j != guess:                        groups[H[guess][j]].append(j)                max_group = max(groups, key=len)                if len(max_group) < len(min_max_group):                    min_max_group, best_guess = max_group, guess            return best_guess        H = [[sum(a == b for a, b in itertools.izip(wordlist[i], wordlist[j]))                  for j in xrange(len(wordlist))]                  for i in xrange(len(wordlist))]        possible = range(len(wordlist))        n = 0        while possible and n < 6:            guess = solve(H, possible)            n = master.guess(wordlist[guess])            possible = [j for j in possible if H[guess][j] == n]

Python:

# Space: O(n)class Solution2(object):    def findSecretWord(self, wordlist, master):        """        :type wordlist: List[Str]        :type master: Master        :rtype: None        """        def solve(H, possible):            min_max_group, best_guess = possible, None            for guess in possible:                groups = [[] for _ in xrange(7)]                for j in possible:                    if j != guess:                        groups[H[guess][j]].append(j)                max_group = groups[0]                if len(max_group) < len(min_max_group):                    min_max_group, best_guess = max_group, guess            return best_guess        H = [[sum(a == b for a, b in itertools.izip(wordlist[i], wordlist[j]))                  for j in xrange(len(wordlist))]                  for i in xrange(len(wordlist))]        possible = range(len(wordlist))        n = 0        while possible and n < 6:            guess = solve(H, possible)            n = master.guess(wordlist[guess])            possible = [j for j in possible if H[guess][j] == n]

Python:

def findSecretWord(self, wordlist, master):        n = 0        while n < 6:            count = collections.Counter(w1 for w1, w2 in itertools.permutations(wordlist, 2) if self.match(w1, w2) == 0)            guess = min(wordlist, key=lambda w: count[w])            n = master.guess(guess)            wordlist = [w for w in wordlist if self.match(w, guess) == n]  

C++:

void findSecretWord(vector
& wordlist, Master& master) { for (int i = 0, x = 0; i < 10 && x < 6; ++i) { unordered_map
count; for (string w1 : wordlist) for (string w2 : wordlist) if (match(w1, w2) == 0) count[w1]++; pair
minimax = make_pair(wordlist[0], 1000); for (string w : wordlist) if (count[w] <= minimax.second) minimax = make_pair(w, count[w]); x = master.guess(minimax.first); vector
wordlist2; for (string w : wordlist) if (match(minimax.first, w) == x) wordlist2.push_back(w); wordlist = wordlist2; } }

C++:  

/**6 / 6 test cases passed.Status: AcceptedRuntime: 2 ms*/class Master {  public:    int guess(string word);};class Solution {public:    int match(const string a, const string b){        int ans = 0;                for(int i = 0;i
& wordlits, const string guessWord, const int matches){ vector
tmp; for(string word : wordlits){ int m = match(word, guessWord); if(m == matches){ tmp.push_back(word); } } wordlits = tmp; } void findSecretWord(vector
& wordlist, Master& master) { string target = wordlist[random() % wordlist.size()]; int Count = 10; while(Count--){ int matches = master.guess(target); shrinkWordList(wordlist, target, matches); target = wordlist[random() % wordlist.size()]; } }};

  

  

  

 

转载于:https://www.cnblogs.com/lightwindy/p/9795777.html

你可能感兴趣的文章
JS设计模式——3.封装与信息隐藏
查看>>
git-- 使用
查看>>
Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo
查看>>
delphi对窗体的查询(delphi xe2)
查看>>
Ajax跨域:Jsonp原理解析
查看>>
hdu 5099 Comparison of Android versions 枚举题意
查看>>
算法第二章上机实践报告
查看>>
linux--memcache的安装和使用(转)
查看>>
有关于Matlab的regionprops函数的PixelIdxList和PixelList的一点解释
查看>>
Event Loop
查看>>
new做了些什么?
查看>>
BZOJ3835[Poi2014]Supercomputer——斜率优化
查看>>
POJ-1861 Network
查看>>
Java:从字符串文本中获得数字
查看>>
Airbnb的面经复习笔记
查看>>
去面试啦 面试准备
查看>>
细说SSO单点登录
查看>>
hdu 1754
查看>>
51Nod-1276-岛屿的数量
查看>>
WebService 小实例
查看>>