294 Flip Game II

1. Question

You are playing the following Flip Game with your friend: Given a string that contains only these two characters:+and-, you and your friend take turns to flip twoconsecutive"++"into"--". The game ends when a person can no longer make a move and therefore the other person will be the winner.

Write a function to determine if the starting player can guarantee a win.

Example:

Input:
s = "++++"
Output:
 true 

Explanation: 
The starting player can guarantee a win by flipping the middle "++" to become "+--+".

Follow up: Derive your algorithm's runtime complexity.

(1) Memoization

思路:

class Solution {
    public boolean canWin(String s) {
        if (s == null || s.length() <= 1) {
            return false;
        }

        Map<String, Boolean> cache = new HashMap();
        return canWin(s, cache);
    }

    public boolean canWin(String s, Map<String, Boolean> cache) {
        if (cache.containsKey(s)) {
            return cache.get(s);
        }

        for (int i = 0; i < s.length(); i++) {
            if (s.startsWith("++", i)) {
                String t = s.substring(0, i) + "--" + s.substring(i + 2);

                if (!canWin(t, cache)) {
                    cache.put(s, true);
                    return true;
                }
            }
        }
        cache.put(s, false);
        return false;
    }
}

3. Time & Space Complexity

Memoization: 时间复杂度O(), 空间复杂度O()

Last updated

Was this helpful?