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简化末尾删除写法;
  • 关键注意:*删除操作必须判断缓冲区长度,防止下标越界。
相关推荐
猎头南楼5 小时前
MFC 质量流量控制器中的控制算法设计与落地思考
人工智能·算法
来一碗刘肉面5 小时前
平衡二叉树的删除
数据结构·算法
wabs6665 小时前
关于二叉树【力扣199.二叉树的右视图的思考】
数据结构·c++·算法·leetcode·二叉树·层序遍历
a187927218316 小时前
【算法】动态规划第三篇:背包第一课——贪心之死与正序倒序开关
算法·leetcode·动态规划·贪心·dp·暴力·算法讲解
黄金龙PLUS6 小时前
Xoodoo置换算法的优缺点
算法·网络安全·密码学·哈希算法·同态加密
Cccp.1236 小时前
【leetcode】(四)排序算法汇总和链表
leetcode·链表·排序算法
自小吃多6 小时前
PCB Editor软件走线、修线操作笔记
笔记·嵌入式硬件
LayZhangStrive6 小时前
数据结构与算法 - 堆排序
java·数据结构·算法·排序算法·堆排序·大根堆
Hammer_Hans6 小时前
DFT笔记121
笔记
residual_fan7 小时前
深度渐进收缩学习(DPSL):面向强噪声与类内分散的机械复合故障诊断方法
人工智能·算法·数据挖掘·数据分析