你和朋友玩一个叫做「翻转游戏」的游戏,游戏规则:给定一个只有 + 和 - 的字符串。你和朋友轮流将 连续 的两个 "++" 反转成 "--"。 当一方无法进行有效的翻转时便意味着游戏结束,则另一方获胜。
请你写出一个函数来判定起始玩家是否存在必胜的方案。
示例:
输入: s = "++++"
输出: true
解析: 起始玩家可将中间的 "++" 翻转变为 "+--+" 从而得胜。
延伸:
请推导你算法的时间复杂度。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/flip-game-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
第一种思路:
如果我翻转了一次之后,生成的新的字符串朋友必输,那么就代表我必胜,
怎么判断朋友输不输呢?递归调用自身即可。
class Solution(object):
def canWin(self, s):
"""
:type s: str
:rtype: bool
"""
for i in range(len(s) - 1):
if s[i:i + 2] == "++" and not self.canWin(s[:i] + "--" + s[i + 2:]):
return True
return False
第二种思路:
第一种思路比较慢,而且打印出来每次调用的s可以发现,会出现重复的s,
所以此时不妨采取记忆化的方法,用一个哈希表存储每次调用的答案。
class Solution(object):
def canWin(self, string):
"""
:type s: str
:rtype: bool
"""
record = {}
def helper(s):
if s in record:
return record[s]
for i in range(len(s) - 1):
if s[i:i + 2] == "++":
next_s = s[:i] + "--" + s[i + 2:]
if not helper(next_s):
record[next_s] = False
return True
return False
return helper(string)