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简化末尾删除写法;
  • 关键注意:*删除操作必须判断缓冲区长度,防止下标越界。
相关推荐
地平线开发者32 分钟前
点云算法整理与常用计算模块:从数据到模型,再到工程与量化
算法·自动驾驶
蒸蒸yyyyzwd1 小时前
后端学习笔记 day111
笔记·学习
叼烟扛炮2 小时前
[LangChain] 学习笔记(08):工具调用底层闭环与第三方搜索(Tavily)实战
人工智能·笔记·学习·langchain
武子康3 小时前
H3-World 为何在加载 LoRA 前,先检查导入的代码?
人工智能·深度学习·算法
江屿风3 小时前
【Git-组件】【Git入门:从文档灾难到版本掌控】流食般投喂
运维·笔记·git·组件·版本控制
秋天的怀念_David4 小时前
算法一千零一夜 · 第二十八夜 注册
java·程序人生·算法
小李不想当小白4 小时前
HAL库之UART(STM32 HAL库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
旖旎夜光5 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
Rain的Java大神之路5 小时前
LeetCode 37 解数独面试攻略:回溯 + 位掩码 + MRV,从暴力到毫秒级求解
java·后端·leetcode
NEFU_Jyj5 小时前
贝尔数(组合数学)
算法