其实本题并不是很难,只是我觉得这个方法太傻了就没用,后来看了讨论,感觉这个方法在面试中也是可行的,就决定直接用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;}}
