LeetCode 每日一题笔记 日期:2026.06.16 题目:3612. 字符串特殊符号处理

LeetCode 每日一题笔记

0. 前言

  • 日期:2026.06.16
  • 题目:3612. 字符串特殊符号处理
  • 难度:简单
  • 标签:字符串、模拟、StringBuilder

1. 题目理解

问题描述 :

给定字符串 s,遍历每个字符按规则处理:

  1. *:删除缓冲区最后一个字符,缓冲区为空则不操作;
  2. #:将当前缓冲区内容拼接一份追加到自身末尾;
  3. %:反转当前缓冲区全部字符;
  4. 普通小写字母:直接追加到缓冲区末尾;
    遍历完成后返回缓冲区拼接成的字符串。

示例:

输入:s = "a*b#%"

过程:

a → a

  • → 删末尾 → \[\]
    b → b

→ 拼接自身 → b,b

% → 反转 → b,b

输出:"bb"

2. 解题思路

核心观察

  • 全部操作基于可变字符串容器 StringBuilder,无需额外数组存储中间状态;
  • 四类字符互斥,一次遍历即可完成全部变换;
  • 优化方向:合并判断逻辑、减少多层if-else嵌套,简化分支。

算法步骤

  1. 新建空 StringBuilder 作为操作缓冲区;
  2. 遍历输入字符串每一个字符;
  3. 根据字符符号执行对应增删/复制/反转操作;
  4. 遍历结束,将缓冲区转为字符串返回。

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简化末尾删除写法;
  • 关键注意:*删除操作必须判断缓冲区长度,防止下标越界。
相关推荐
心中有你02143 小时前
C语言埃氏筛法(素数筛选)
c语言·数据结构·算法
Omics Pro4 小时前
Cell封面|衰老生物学开源AI工具包
数据库·人工智能·算法·机器学习·自然语言处理
UIU1146 小时前
递归算法与汉诺塔
c++·学习·算法·c#·递归
用户9799848071812 小时前
200 行代码写一个能跑的 AI Agent:不依赖任何框架,只靠 tool-calling 原理
算法
threerocks12 小时前
【Muse实战】X 流量作战室搭建保姆级教程 - 拥有你自己的运营团队
算法
GreenTea12 小时前
深度拆解 ScienceBuddy:如何用“双层递归自进化”构建高可靠科研 Agent Harness
前端·后端·算法
花椒技术12 小时前
2.46 秒生成 5 秒视频:拆解 H3 Max 的模型、推理栈与硬件协同
算法·音视频开发·视频编码
vivo互联网技术12 小时前
ART:妆容迁移框架,重新定义高保真妆容迁移 | ECCV 2026
人工智能·算法·图像识别
用户04414409244912 小时前
卫星信号模拟器里的四个坐标转换公式
算法
橘和柠12 小时前
阿里 open-code-review (AI代码审查工具)实战:安装、四层规则链、自定义规则格式与实测避坑
算法·面试