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简化末尾删除写法;
  • 关键注意:*删除操作必须判断缓冲区长度,防止下标越界。
相关推荐
维他奶糖6124 分钟前
基于 DrissionPage 实现小红书搜索笔记批量采集
笔记
先吃饱再说39 分钟前
为什么堆能 O(log n) 插入?拆解完全二叉树的数组魔法
算法·排序算法
留白_1 小时前
【决策树】泰坦尼克号生存预测
算法·决策树·机器学习
hssfscv1 小时前
QT的学习笔记4——QMainWindow、资源文件以及主要控件的介绍
笔记·qt·学习
克里斯蒂亚诺更新1 小时前
电脑关闭密码的操作
笔记
hqzing1 小时前
鸿蒙 PC 底层开发技术详解(七):二进制自签名算法的实现
算法·华为·harmonyos
AI科技星1 小时前
超复数全域经济周期场与信息谱场——金融与密码学底层理论重构《0·1·∞三元一体全域超复数统一场论》系列全集(六一字不漏完整合订终版)
人工智能·算法·金融·密码学·拓扑学·乖乖数学·全域数学
小小的代码里面挖呀挖呀挖2 小时前
杰理蓝牙耳机开发--LE Audio与游戏耳机应用
笔记·单片机·物联网·学习
AI科技星2 小时前
《01无穷全域信息场论:算子G与宇宙本体高维完备公理大典》
人工智能·python·算法·金融·乖乖数学·全域数学
Tim_102 小时前
【C++】013、空类占多少字节?
算法