【简单】力扣算法题解析LeetCode293:翻转游戏

关注文末推广名片,即可免费获得本题测试源码

题目来源:🔒LeetCode293:翻转游戏

问题抽象: 给定一个仅包含 '+''-' 两种字符的字符串 s,要求枚举并返回所有 单次翻转操作 后生成的新字符串,需满足以下核心需求:

  1. 翻转规则定义

    • 每次操作 仅允许 翻转 两个连续的 '+'(即 "++""--");
    • 操作需遍历字符串中 所有满足条件的连续位置(位置 i 满足 s[i] == s[i+1] == '+')。
  2. 操作独立性

    • 每次翻转操作 独立作用 于原字符串(非连续操作);
    • 生成的新字符串需 保留未翻转部分 的原始状态。
  3. 边界处理

    • 若字符串长度 < 2 或无连续 "++",返回 空列表
    • 输入字符串长度范围 [1, 500],且字符仅含 '+''-'
  4. 输出要求

    • 结果列表顺序 不限,但需包含 所有可能的新字符串(无重复);
    • 每个新字符串长度与原字符串相同。

输入:字符串 s(如 "++++"
输出:列表(如 ["--++", "+--+", "++--"]),包含所有单次翻转操作生成的合法字符串。


解题思路

  1. 核心逻辑
    遍历字符串,每次检查当前位置 i 和前一位置 i-1 是否均为 +。若是,则将这两个字符替换为 --,生成新字符串并加入结果集。
  2. 优化目标
    • 时间优化:仅需一次遍历(时间复杂度 O(n)),避免嵌套循环。
    • 空间优化:直接使用 String.substring 拼接新字符串,避免创建中间对象(如 char[]),减少内存分配。
  3. 边界处理
    • 字符串长度 < 2 时直接返回空列表。
    • 从索引 1 开始遍历(避免 i-1 越界)。

代码实现(Java版)

class Solution {
    public List<String> generatePossibleNextMoves(String s) {
        List<String> result = new ArrayList<>();
        int n = s.length();
        // 边界情况:长度不足2时无有效操作
        if (n < 2) {
            return result;
        }
        // 遍历字符串,检查连续两个'+'
        for (int i = 1; i < n; i++) {
            if (s.charAt(i) == '+' && s.charAt(i - 1) == '+') {
                // 直接拼接新字符串:s[0, i-1) + "--" + s[i+1, end]
                String newState = s.substring(0, i - 1) + "--" + s.substring(i + 1);
                result.add(newState);
            }
        }
        return result;
    }
}

代码说明

  1. 高效字符串拼接
    • 使用 s.substring(0, i - 1)s.substring(i + 1) 截取子串,直接与 "--" 拼接。
    • 避免创建 char[]StringBuilder 对象,减少内存开销。
  2. 遍历范围
    • 索引从 1n-1,确保 i-1 不越界。
  3. 提前终止
    • 无连续 "++" 时直接返回空列表,无需额外判断。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值