1、题目描述
2、解题思路
题目要求先手必胜的方案,于是思路在于遍历所有的先手可能,对于每一个先手,一路玩下去,看当前先手策略是不是能让先手赢。
每一步的结果都给后面带来若干个可能的游戏走向,于是定义一个 map 来保存已经经历过的状况。
遍历 s 的所有可能先手策略,判断该先手策略后,新的字符串 ss 是否会让先手赢,把结果保存在 map 中。
3、解题代码
class Solution {
private Map<String, Boolean> map = map = new HashMap<>();
public boolean canWin(String s) {
if (map.containsKey(s)) {
return map.get(s);
}
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i) == '+' && s.charAt(i - 1) == '+') {
String ss = s.substring(0, i - 1) + "--" + s.substring(i + 1);
if (!canWin(ss)) {
map.put(ss, false);
return true; // 找到一个玩家A先手后玩家B就赢不了的先手策略
} else {
map.put(ss, true);
}
}
}
return false; // 找不到一个先手就赢的先手策略
}
}