【LeetCode - 294】翻转游戏 II

1、题目描述

在这里插入图片描述

2、解题思路

  题目要求先手必胜的方案,于是思路在于遍历所有的先手可能,对于每一个先手,一路玩下去,看当前先手策略是不是能让先手赢。

  每一步的结果都给后面带来若干个可能的游戏走向,于是定义一个 map 来保存已经经历过的状况。

  遍历 s 的所有可能先手策略,判断该先手策略后,新的字符串 ss 是否会让先手赢,把结果保存在 map 中。

3、解题代码

class Solution {
    private Map<String, Boolean> map = map = new HashMap<>();

    public boolean canWin(String s) {
        if (map.containsKey(s)) {
            return map.get(s);
        }
        for (int i = 1; i < s.length(); i++) {
            if (s.charAt(i) == '+' && s.charAt(i - 1) == '+') {
                String ss = s.substring(0, i - 1) + "--" + s.substring(i + 1);
                if (!canWin(ss)) {
                    map.put(ss, false);
                    return true;    // 找到一个玩家A先手后玩家B就赢不了的先手策略
                } else {
                    map.put(ss, true);
                }
            }
        }
        return false;   // 找不到一个先手就赢的先手策略
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值