All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0801_0900.s0843_guess_the_word.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g0801_0900.s0843_guess_the_word;

// #Hard #Array #String #Math #Game_Theory #Interactive
// #2022_03_24_Time_2_ms_(68.01%)_Space_41.5_MB_(70.30%)

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/*
 * // This is the Master's API interface.
 * // You should not implement it, or speculate about its implementation
 * interface Master {
 *     public int guess(String word) {}
 * }
 */
/**
 * 843 - Guess the Word\.
 *
 * Hard
 *
 * 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.
 *
 * **Constraints:**
 *
 * *   `1 <= wordlist.length <= 100`
 * *   `wordlist[i].length == 6`
 * *   `wordlist[i]` consist of lowercase English letters.
 * *   All the strings of `wordlist` are **unique**.
 * *   `secret` exists in `wordlist`.
 * *   `numguesses == 10`
**/
public class Solution {
    interface Master {
        int guess(String word);
    }

    private int next = 0;

    public void findSecretWord(String[] wordlist, Master master) {
        List 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 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;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy