leetcode_294 翻转游戏 II

132 阅读2分钟

要求

你和朋友玩一个叫做「翻转游戏」的游戏。游戏规则如下:

给你一个字符串 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

image.png

重点题目

解题思路:

这个题是重在理解题意,我们需要构建出来一个让对手无法反转的+-的组合,如果我们可以找到的话,我们就返回True,否则就不能成功,返回False;第一种解法:我们使用一个字典进行记录,记录不行的数据结构,免得后面重复判断,然后我们对其循环,不断向后进行寻找,只要有一个成功的就退出,对于一个字符串,我们使用递归的思想,不断向后变换,失败的都放到记录中,较为高效;第二种解法:直接对自身进行递归调用,思路和上面一样,但是可能多次计算相同信息,效率比较低。