> For the complete documentation index, see [llms.txt](https://protegejj.gitbook.io/oj-practices/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://protegejj.gitbook.io/oj-practices/chapter1/depth-first-search/memoization/294-flip-game-ii.md).

# 294 Flip Game II

## 294. [Flip Game II](https://leetcode.com/problems/flip-game-ii/description/)

## 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 two**consecutive**`"++"`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**

思路:

```java
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()
