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简化末尾删除写法;
  • 关键注意:*删除操作必须判断缓冲区长度,防止下标越界。
相关推荐
CoderYanger1 小时前
A.每日一题:2095. 删除链表的中间节点
java·数据结构·程序人生·leetcode·链表·面试·职场和发展
Jasmine_llq1 小时前
《B4264 [GESP202503 四级] 二阶矩阵》
线性代数·算法·矩阵·二维矩阵遍历枚举所有2×2矩阵·交叉乘积等式条件判断·输入输出快读加速·长整型防溢出计数统计
Cloud_Shy6181 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第七章 Item 52 - 53)
开发语言·人工智能·笔记·python
星恒随风1 小时前
C++ string 类详解:常用接口、OJ 场景与模拟实现中的深浅拷贝
开发语言·c++·笔记·学习·状态模式
searchforAI2 小时前
2026国产AI笔记工具横评:Get笔记、Ai好记、通义听悟、BiBiGPT各有什么特色?
人工智能·笔记·学习·ai·音视频·知识图谱·知识库
不知名的老吴2 小时前
面经经验分享|算法和数据结构考察
数据结构·经验分享·算法
叫我:松哥2 小时前
基于Python flask的中学可控智能命题系统设计与实现,整合遗传算法、DeepSeek 大模型及数据库技术构建一体化应用
数据库·人工智能·python·算法·机器学习·flask·遗传算法
CoderYanger2 小时前
A.每日一题:3612. 用特殊操作处理字符串 I
java·程序人生·leetcode·面试·职场和发展·学习方法·改行学it
黎阳之光2 小时前
黎阳之光透明大楼:实景孪生重构智慧建筑全新范式
人工智能·物联网·算法·安全·数字孪生