其实本题并不是很难,只是我觉得这个方法太傻了就没用,后来看了讨论,感觉这个方法在面试中也是可行的,就决定直接用recursive。但是在这个基础上加了memorization里记录必赢和必输的String
- 时间复杂度:
- 最开始有
种组合
- 当第一层设定好之后,根据位置的不同,最多会有
种可能性,当然也可能更少
- 所以时间复杂度是
- 也被称作Double Factorial
- 最开始有
代码:
class Solution {
public boolean canWin(String s) {
Set<String> winSet = new HashSet<>();
Set<String> loseSet = new HashSet<>();
return helper(s, winSet, loseSet);
}
private boolean helper(String s, Set<String> winSet, Set<String> loseSet) {
if (winSet.contains(s)) {
return true;
}
if (loseSet.contains(s)) {
return false;
}
for (int i = 0; i < s.length() - 1; ++i) {
if (s.charAt(i) == '+' && s.charAt(i+1) == '+') {
String newS = s.substring(0, i) + "--" + s.substring(i+2);
if (!helper(newS, winSet, loseSet)) {
winSet.add(s);
return true;
}
}
}
loseSet.add(s);
return false;
}
}