要求
你和朋友玩一个叫做「翻转游戏」的游戏。游戏规则如下:
给你一个字符串 currentState ,其中只含 '+' 和 '-' 。你和朋友轮流将 连续 的两个 "++" 反转成 "--" 。当一方无法进行有效的翻转时便意味着游戏结束,则另一方获胜。默认每个人都会采取最优策略。
请你写出一个函数来判定起始玩家 是否存在必胜的方案 :如果存在,返回 true ;否则,返回 false 。
示例 1:
输入:currentState = "++++"
输出:true
解释:起始玩家可将中间的 "++" 翻转变为 "+--+" 从而得胜。
示例 2:
输入:currentState = "+"
输出:false
核心代码
class Solution:
def canWin(self, currentState: str) -> 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:]
print(next_s)
if not helper(next_s):
record[next_s] = False
return True
return False
return helper(currentState)
另一解法
class Solution:
def canWin(self, currentState: str) -> bool:
for i in range(len(currentState) - 1):
if currentState[i:i+2] == "++" and not self.canWin(currentState[:i] + "--" + currentState[i + 2:]):
return True
return False
重点题目
解题思路:
这个题是重在理解题意,我们需要构建出来一个让对手无法反转的+-的组合,如果我们可以找到的话,我们就返回True,否则就不能成功,返回False;第一种解法:我们使用一个字典进行记录,记录不行的数据结构,免得后面重复判断,然后我们对其循环,不断向后进行寻找,只要有一个成功的就退出,对于一个字符串,我们使用递归的思想,不断向后变换,失败的都放到记录中,较为高效;第二种解法:直接对自身进行递归调用,思路和上面一样,但是可能多次计算相同信息,效率比较低。