JIAKAOBO

LeetCode

venmo
wechat

感谢赞助!

  • ㊗️
  • 大家
  • offer
  • 多多!

Problem

This is an interactive problem.

You are given an array of unique strings wordlist where wordlist[i] 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 exactly 10 guesses to guess the word. At the end of any number of calls, if you have made 10 or fewer calls to Master.guess and at least one of these guesses was secret, then you pass the test case.

Example 1:

Input: secret = "acckzz", wordlist = ["acckzz","ccbazz","eiowzz","abcczz"], numguesses = 10
Output: You guessed the secret word correctly.
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.

Example 2:

Input: secret = "hamada", wordlist = ["hamada","khaled"], numguesses = 10
Output: You guessed the secret word correctly.

Code

80%左右的通过率

/**
 * // This is the Master's API interface.
 * // You should not implement it, or speculate about its implementation
 * interface Master {
 *     public int guess(String word) {}
 * }
 */
class Solution {
    public int match(String a, String b) {
        int matches = 0;
        for (int i = 0; i < a.length(); ++i) {
            if (a.charAt(i) == b.charAt(i)) {
                matches ++;
            }
        }
        return matches;
    }

    public void findSecretWord(String[] wordlist, Master master) {
        // 只能猜10次,每个单词有6个字母;如果x = 6表示猜中了
        for (int i = 0, x = 0; i < 10 && x < 6; ++i) {
            // 先随机选一个单词
            String guess = wordlist[new Random().nextInt(wordlist.length)];
            // 看这个单词和要secret有几个match
            x = master.guess(guess);
            // 下一步的list
            List<String> wordlist2 = new ArrayList<>();
            // 遍历每一个单词,只保存那些和当前单词有相同字符的单词
            // 然后进入下一轮循环
            for (String w : wordlist){
                if (match(guess, w) == x){
                     wordlist2.add(w);
                }
            }

            wordlist = wordlist2.toArray(new String[wordlist2.size()]);
        }
    }
}