843. Guess the Word

Difficulty:
Related Topics:
Similar Questions:

    Problem

    You are given an array of unique strings words where words[i] is six letters long. One word of words was chosen as a secret word.

    You are also given the helper object Master. You may call Master.guess(word) where word is a six-letter-long string, and it must be from words. Master.guess(word) returns:

    There is a parameter allowedGuesses for each test case where allowedGuesses is the maximum number of times you can call Master.guess(word).

    For each test case, you should call Master.guess with the secret word without exceeding the maximum number of allowed guesses. You will get:

    The test cases are generated such that you can guess the secret word with a reasonable strategy (other than using the bruteforce method).

      Example 1:

    Input: secret = "acckzz", words = ["acckzz","ccbazz","eiowzz","abcczz"], allowedGuesses = 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", words = ["hamada","khaled"], allowedGuesses = 10
    Output: You guessed the secret word correctly.
    Explanation: Since there are two words, you can guess both.
    

      Constraints:

    Solution

    /**
     * // 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 {
        private int next = 0;
    
        public void findSecretWord(String[] wordlist, Master master) {
            List<String> list = Arrays.asList(wordlist);
            Collections.shuffle(list);
            boolean[] test = new boolean[wordlist.length];
            while (true) {
                int num = master.guess(list.get(next));
                if (num == 6) {
                    break;
                }
                updateList(list, test, num);
            }
        }
    
        private void updateList(List<String> list, boolean[] test, int num) {
            int index = next;
            for (int i = index + 1; i < test.length; i++) {
                if (test[i]) {
                    continue;
                }
                int samePart = getSame(list.get(index), list.get(i));
                if (samePart != num) {
                    test[i] = true;
                } else if (next == index) {
                    next = i;
                }
            }
        }
    
        private int getSame(String word1, String word2) {
            int ret = 0;
            for (int i = 0; i < 6; i++) {
                if (word1.charAt(i) == word2.charAt(i)) {
                    ret++;
                }
            }
            return ret;
        }
    }
    

    Explain:

    nope.

    Complexity: