题目来源:🔒LeetCode293:翻转游戏
问题抽象: 给定一个仅包含 '+' 和 '-' 两种字符的字符串 s,要求枚举并返回所有 单次翻转操作 后生成的新字符串,需满足以下核心需求:
-
翻转规则定义:
- 每次操作 仅允许 翻转 两个连续的
'+'(即"++"→"--"); - 操作需遍历字符串中 所有满足条件的连续位置(位置
i满足s[i] == s[i+1] == '+')。
- 每次操作 仅允许 翻转 两个连续的
-
操作独立性:
- 每次翻转操作 独立作用 于原字符串(非连续操作);
- 生成的新字符串需 保留未翻转部分 的原始状态。
-
边界处理:
- 若字符串长度
< 2或无连续"++",返回 空列表; - 输入字符串长度范围
[1, 500],且字符仅含'+'或'-'。
- 若字符串长度
-
输出要求:
- 结果列表顺序 不限,但需包含 所有可能的新字符串(无重复);
- 每个新字符串长度与原字符串相同。
输入:字符串 s(如 "++++")
输出:列表(如 ["--++", "+--+", "++--"]),包含所有单次翻转操作生成的合法字符串。
解题思路
- 核心逻辑:
遍历字符串,每次检查当前位置i和前一位置i-1是否均为+。若是,则将这两个字符替换为--,生成新字符串并加入结果集。 - 优化目标:
- 时间优化:仅需一次遍历(时间复杂度
O(n)),避免嵌套循环。 - 空间优化:直接使用
String.substring拼接新字符串,避免创建中间对象(如char[]),减少内存分配。
- 时间优化:仅需一次遍历(时间复杂度
- 边界处理:
- 字符串长度
< 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;
}
}
代码说明
- 高效字符串拼接:
- 使用
s.substring(0, i - 1)和s.substring(i + 1)截取子串,直接与"--"拼接。 - 避免创建
char[]或StringBuilder对象,减少内存开销。
- 使用
- 遍历范围:
- 索引从
1到n-1,确保i-1不越界。
- 索引从
- 提前终止:
- 无连续
"++"时直接返回空列表,无需额外判断。
- 无连续

2253

被折叠的 条评论
为什么被折叠?



