LeetCode 每日一题笔记
0. 前言
- 日期:2026.06.16
- 题目:3612. 字符串特殊符号处理
- 难度:简单
- 标签:字符串、模拟、StringBuilder
1. 题目理解
问题描述 :
给定字符串 s,遍历每个字符按规则处理:
*:删除缓冲区最后一个字符,缓冲区为空则不操作;#:将当前缓冲区内容拼接一份追加到自身末尾;%:反转当前缓冲区全部字符;- 普通小写字母:直接追加到缓冲区末尾;
遍历完成后返回缓冲区拼接成的字符串。
示例:
输入:s = "a*b#%"
过程:
a → a
- → 删末尾 → \[\]
b → b
→ 拼接自身 → b,b
% → 反转 → b,b
输出:"bb"
2. 解题思路
核心观察
- 全部操作基于可变字符串容器
StringBuilder,无需额外数组存储中间状态; - 四类字符互斥,一次遍历即可完成全部变换;
- 优化方向:合并判断逻辑、减少多层if-else嵌套,简化分支。
算法步骤
- 新建空
StringBuilder作为操作缓冲区; - 遍历输入字符串每一个字符;
- 根据字符符号执行对应增删/复制/反转操作;
- 遍历结束,将缓冲区转为字符串返回。
3. 代码实现
java
package lc3600_lc3699.lc3612;
public class Solution {
public String processStr(String s) {
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
if (c == '*') {
if (sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
}
} else if (c == '#') {
sb.append(sb);
} else if (c == '%') {
sb.reverse();
} else {
sb.append(c);
}
}
return sb.toString();
}
}
4. 代码优化说明
java
public class Solution {
public String processStr(String s) {
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
// 匹配特殊符号,使用switch替代多层if-else,减少分支层级
switch (c) {
case '*':
// 仅缓冲区非空时删除末尾
if (sb.length() > 0) sb.setLength(sb.length() - 1);
break;
case '#':
// 拼接当前缓存
sb.append(sb);
break;
case '%':
// 反转缓存
sb.reverse();
break;
default:
// 普通字符直接追加
sb.append(c);
break;
}
}
return sb.toString();
}
}
5. 复杂度分析
- 原始if多分支版本
时间复杂度:O(L+M)O(L + M)O(L+M),L为输入字符串长度,M为缓冲区操作总字符数(复制/反转)
空间复杂度:O(M)O(M)O(M),StringBuilder存储处理后的字符 - switch优化版本
时间复杂度:O(L+M)O(L + M)O(L+M),时间量级不变,分支跳转效率高于连续if判断
空间复杂度:O(M)O(M)O(M),无额外容器开销,仅替换分支判断结构
6. 总结
- 核心:基于可变字符串缓冲区模拟四类符号操作;
- 优化亮点:用
switch替换多层if-else,扁平化分支结构,减少条件判断层级;使用setLength简化末尾删除写法; - 关键注意:
*删除操作必须判断缓冲区长度,防止下标越界。