LeetCode Hot100(52/100)——394. 字符串解码

LeetCode刷题——394. 字符串解码(HOT100) ✊✊✊🌈大家好!本篇文章将较详细介绍栈的题目`394. 字符串解码`,提供`栈和递归`两种解法。代码语言为:**C++代码**😇。 阅读详情

一、题目理解

题目要求我们对一个编码字符串进行解码。
编码规则是:

  • k[encoded_string] 表示将方括号内部的字符串重复 k 次。
  • 示例:3[a2[c]] 的解码结果是 "accaccacc"。

这是一个典型的栈结构混合递归问题,需要处理多层嵌套的结构。


示例

输入输出解释
"3[a]2[bc]""aaabcbc""a" 重复 3 次 + "bc" 重复 2 次
"3[a2[c]]""accaccacc""a2[c]" = "acc" → "acc" 重复 3 次
"2[abc]3[cd]ef""abcabccdcdcdef"按顺序拼接每种模式

二、问题分析

该题考察的核心点是:

  1. 括号嵌套结构处理
  2. 数字与字符串的配对
  3. 字符串的重复与拼接

我们可以有两种主要思路:

  • 方法一:使用栈模拟解码过程
  • 方法二:使用递归处理嵌套结构

三、思维导图

Decode String

栈解法

处理数字

处理字母

处理'['与']'

递归解法

遇到数字时展开递归

遇到']'时返回结果

复杂度分析

时间复杂度 O(n)

空间复杂度 O(n)


四、方法一:栈解法

原理说明

我们借助两个栈:

  • 数值栈:用于存储每次遇到的倍数 k
  • 字符串栈:用于存储当前构造的字符串

遇到 [ 时,我们将当前计数与当前字符串入栈;
遇到 ] 时,我们取出栈顶元素进行拼接,实现一层解码。

执行过程示例(输入:“3[a2[c]]”)

当前指针 数字栈 字符串栈 当前指针 数字栈 字符串栈 读取数字3入栈 读取'[',进入新层,当前字符串入栈 遇数字2入栈 遇'[',进入嵌套层 读取"c",拼接当前字符串 遇']',出栈2,将"c"重复2次 → "cc" 合并成"a"+"cc" → "acc" 遇']',出栈3,重复"acc" 3次 → "accaccacc"

Java 实现

public class Solution {
    public String decodeString(String s) {
        // 数值栈
        Stack<Integer> numStack = new Stack<>();
        // 字符串栈
        Stack<StringBuilder> strStack = new Stack<>();
        // 当前字符串
        StringBuilder curr = new StringBuilder();
        int num = 0;

        for (char c : s.toCharArray()) {
            if (Character.isDigit(c)) {
                // 构造多位数字
                num = num * 10 + (c - '0');
            } else if (c == '[') {
                numStack.push(num);
                strStack.push(curr);
                curr = new StringBuilder();
                num = 0;
            } else if (c == ']') {
                StringBuilder prev = strStack.pop();
                int repeat = numStack.pop();
                StringBuilder temp = new StringBuilder();
                for (int i = 0; i < repeat; i++) temp.append(curr);
                curr = prev.append(temp);
            } else {
                curr.append(c);
            }
        }
        return curr.toString();
    }
}

时间复杂度与空间复杂度分析

项目复杂度
时间复杂度O(n)(每个字符只被扫描一次)
空间复杂度O(n)(栈和字符串拼接过程中的存储)

五、方法二:递归解法

原理说明

递归方法直接模拟字符串的展开过程:

  • 当遇到数字时,记录重复次数;
  • 遇到 [ 时进入递归;
  • 遇到 ] 时返回当前构造好的字符串。

递归的关键:每次调用只负责处理当前层级的 [...]。


流程图(递归过程)

数字

字母

[

]

开始 decode

当前字符

构造数字

拼接到结果

进入下一层递归

结束当前递归返回结果

返回构造好的字符串

结束


Java 实现(递归版本)

public class Solution {
    private int index = 0;

    public String decodeString(String s) {
        return decode(s);
    }

    private String decode(String s) {
        StringBuilder result = new StringBuilder();
        int num = 0;

        while (index < s.length()) {
            char c = s.charAt(index);

            if (Character.isDigit(c)) {
                num = num * 10 + (c - '0');
                index++;
            } else if (c == '[') {
                index++;
                String sub = decode(s);
                for (int i = 0; i < num; i++) result.append(sub);
                num = 0;
            } else if (c == ']') {
                index++;
                return result.toString();
            } else {
                result.append(c);
                index++;
            }
        }
        return result.toString();
    }
}

时间复杂度与空间复杂度分析

项目复杂度
时间复杂度O(n)(每层递归遍历字符串一次)
空间复杂度O(n)(递归调用栈深度与字符串存储)

六、方法对比

特性栈解法递归解法
实现难度较直观稍复杂
可读性稍差清晰
性能相似相同
推荐场景适合迭代逻辑处理适合表达嵌套结构

七、总结

Decode String 是一道经典的括号嵌套与字符串操作题,关键在于:

  • 正确处理数字与括号的层级关系;
  • 清晰地定义每层的字符串拼接逻辑;
  • 合理使用栈或递归结构。
用电脑通过网口控制keysight示波器 Keysight HD304MSO示波器提供1GHz带宽、14位高精度ADC及10.1英寸触控屏,支持50μV低噪声信号捕获和1.3M波形/秒刷新率。配备4通道探头、逻辑分析仪接口及100Mpts存储深度,含故障诊断、FFT等高级功能。通过网线连接电脑安装TightVNC软件(示波器IP为169.254.163.24)可实现远程控制,相比U盘传输更高效。(149字) 阅读详情

相关推荐

ADS8681数据手册没讲透的细节:SPI时序、量程切换与电压换算的避坑指南

本文深入解析ADS8681数据手册未提及的SPI时序优化、量程切换陷阱与电压校准技巧。针对树莓派5与ADS8681的SPI通信问题,提供CPOL/CPHA配置建议;详解量程切换的位操作玄机与寄存器配置流程;并提出三步校准法应对非理想供电环境,帮助开发者提升ADC测量精度。

weixin_29178069的博客 524

【Hot 100】394. 字符串解码

通过栈的层级保存机制,每次遇到内层括号时将当前状态冻结,优先处理内层任务。内层处理完毕后,通过弹出的栈元素恢复外层状态继续处理,天然支持无限嵌套结构。),我们需要一种能保存当前处理状态,遇到内层括号时暂停当前任务,处理完内层后能恢复现场继续处理的结构。本题难点在于括号内嵌套括号,需要从内向外生成与拼接字符串,这与栈的先入后出特性对应。时,将当前字符串和数字压栈后重置,开始处理内层结构。由于字符串可能包含多层嵌套的括号结构(如。),确保能正确解析多位数。处理连续多位数字(如。

hhw_hhw的博客 1010

【实战指南】WinPE环境下360系统急救箱的病毒查杀全流程解析

本文详细解析了在WinPE环境下使用360系统急救箱进行病毒查杀的全流程。从制作WinPE启动盘到进入PE环境,再到360急救箱的深度使用和系统修复,提供了实用技巧和常见问题解决方案,帮助用户高效清除顽固病毒。

weixin_28568819的博客 538

Leetcode HOT 100 题目总结(已完结)

文章目录前引题目博客链接Easy No.1 - No.21 前引 这段时间感觉动态规划已经做伤了 就是真的没什么动力再做下去了 后面没做的也都是难的不行的dp题目了 想着还是要做的 这段时间换点口味 把力扣HOT 100题给全做了 写个总结 题目博客链接 Easy No.1 - No.21 461. 汉明距离 617. 合并二叉树 104. 二叉树的最大深度 206. 反转链表 169. 多数元素 21. 合并两个有序链表 ...

Love 6's Private Blog 1万+

泛微OA与金蝶云星空深度集成实战:审批与表单双场景解析

本文深入解析泛微OA与金蝶云星空的深度集成实战,聚焦审批流程与表单对接两大核心场景。通过具体案例,详细阐述了如何实现业务数据与审批流程的自动联动,打破数据孤岛,提升企业运营效率与数据一致性,并分享了接口设计、安全策略及实战避坑指南。

4k5l6j7h8的博客 469

南邮-软件设计实验(C++版)

南邮软件设计 A档 一、分数统计 课题内容:   设计一个分数统计程序。包括学生信息的输入输出以及排序。通过该课题全面熟悉数组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。 课题要求: (1)输入某班级学生的姓名、分数; (2)对(1)的分数进行降幂排列并输出; (3)具有输入输出界面。 示例代码: #include<bits/stdc++.h> using...

Dainelcw 1万+

【Leetcode hot 100】394.字符串解码

摘要:本文探讨了LeetCode 394题“字符串解码”的两种解决方案。通过辅助栈法(最优解)和递归法,处理嵌套编码字符串的重复解码问题。辅助栈法利用数字栈和字符串栈分别维护重复次数和待拼接字符串,时间复杂度O(n),空间复杂度O(n)。递归法则通过分解嵌套子问题,同样实现O(n)的时间复杂度。两种方法均通过示例验证,如输入"3[a2[c]]"时,辅助栈法通过压栈/弹栈操作得到"accaccacc",递归法通过逐层解析实现相同结果。代码实现清晰展示了字符分类处理逻辑,

专注Java和MySQL领域知识分享 972

SQL进阶技巧:数据预处理如何对数据进行分桶【分箱】?

本文详细介绍了数据分析中常见的几种分桶方式:基于业务规则的分桶、等距分桶及等频分桶等,针对每种分桶方式给出了SQL实现

石榴姐yyds 4021

(LeetCode-Hot100)394. 字符串解码

LeetCode 394题要求解码形如k[encoded_string]的字符串。解题方法包括:1)栈模拟法,使用数字栈和字符串栈处理嵌套结构;2)递归法,遇到'['进入递归,']'返回结果;3)双栈优化版本。核心思路是解析数字作为重复次数,处理括号内的字符串重复拼接。代码提供了Java和Go两种实现,分别使用栈和递归方式解决。时间复杂度O(n),空间复杂度O(n)。

小飞的博客 997

Python爬虫实战:用Playwright+Transformer做财经新闻事件驱动分析,我靠它抓住了算力政策的涨停机会

对我来说,这套系统最大的价值不是抓住了几次涨停,而是把“看新闻→分析→决策”的全流程自动化、量化了——不用再被股吧的情绪带偏,不用再熬夜刷新闻,而是用数据和模型做理性判断。更重要的是,搭建这套系统的过程,我吃透了Playwright动态爬虫、Transformer文本分析、量化数据对接这些核心技能,这些技能不管是做量化、做数据分析师,还是做其他领域的爬虫,都能用得上。现在打开PyCharm,跟着代码跑一遍,你也能从海量财经新闻里,挖出属于自己的事件驱动信号——与其靠感觉炒股,不如靠数据说话。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1394

SAP SEGW 事物码里的 Association 建模方式

Association 模型用于描述 OData 模型里不同 Entity Type 之间的关联关系。我们来看一个具体的例子:Principal Entity(主体):代表 association 的主导端。Cardinality(基数):指定主体实体类型和依赖实体类型之间的关系。按 F4 或点击从列表中选择。关联的多重性如下:为引用约束()指定以下参数,目的是将主体实体类型的每个键,关联到从属实体类型的一个属性:Referential Constraints 的一个例子如下: 引用约束(Referenti

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 912

Leetcode C++《热题 Hot 100-63》394. 字符串解码

Leetcode C++《热题 Hot 100-63》394. 字符串解码 题目 思路 代码 class Solution { public: vector<int> numsV; string decodeString(string s) { if (s.length() == 0) return ""; s...

快乐划水程序猿的专栏 397

8、多导睡眠图记录中基于级联自适应滤波器的脑电图信号噪声去除

本文提出了一种基于三级级联自适应滤波器的新型方法,用于去除多导睡眠图(PSG)记录中脑电图(EEG)信号的常见伪迹,包括50/60 Hz电源线干扰、心电图(ECG)和眼电图(EOG)伪迹。该方法采用最小均方(LMS)算法,通过分阶段滤波有效分离并衰减各类噪声,在保留EEG关键神经节律信息的同时显著提升信号质量。研究利用MIT-BIH数据库中的18份真实PSG记录进行验证,结果表明该方法具有无相位失真、实现简单、自适应能力强等优势,适用于睡眠研究及脑机接口等生物医学应用领域。

banana的博客 174

最详细,最简单的力扣(leetcode)hot 100 栈篇讲解

最详细的力扣hot 100的栈章节的内容讲解。保证看了的都能够学会

yyyCode的博客 2078

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

力扣hot100

因为 HashSet 使用的是对象的引用进行比较,所以如果两个节点是同一个节点(即内存地址相同),HashSet 会检测到这个重复的引用,从而判断链表中存在环。我的思路是通过排序后的字符串作为哈希表的键,将原字符串作为值添加到相应的键对应的列表中。否则,更新 merged 列表中最后一个区间的结束值。思路是通过遍历两个链表,计算对应节点值与进位的和,处理进位并构建新链表,最后返回不含虚拟头节点的结果链表。评论区看到一个【还有句话:走到尽头见不到你,于是走过你来时的路,等到相遇时才发现,你也走过我来时的路。

分享技术,分享经验 1977

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

刷题笔记Leetcode Hot 100——394. 字符串解码

本题考察知识点:入栈与出栈。

weixin_49018135的博客 914

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

力扣hot100:394. 字符串解码(递归/括号匹配,字符串之间相对顺序)

本题容易想到用递归处理,在写递归时主要是需要明确自己的递归函数的定义。不过我们也可以利用括号匹配的方式使用栈进行处理。

m0_63997099的博客 1085

【Hot100】LeetCode—394. 字符串解码

394. 字符串解码。

weixin_44382896的博客 575

力扣HOT100之栈:394. 字符串解码

中(由于字符是无法添加到存储字符串的栈中的,因此这里需要将单个字符转换为字符串再压入栈中),如果遇到了。的形式,因此我们需要将栈中对应的中括号和数字弹出并正确处理后,将其压入栈中,以便于后续最终结果的拼接。,我们将其弹出,接下来就是数字部分,注意,字符串中的数字可能不止一位,可能会出现。函数来判断当前遍历到的字符串是否为数字字符,同样,我们也用一个字符串变量。来接收所有的数字,拼接成正确的形式,然后我们直接调用。,则我们需要进行进一步的处理,首先,中的所有的字符,如果当前字符不是。中的字符串拼接起来即可。

weixin_52151595的博客 670

leetcode HOT100总结

本人菜鸡一枚,历时两个月时间把HOT100题做完(Ctrl C-V)了,做完之后还是感觉到很虚,很多中等题还是不会做,于是乎花几天时间把这100题给总结一下。一方面,对自己的知识梳理;另一方面,便于后续回顾。(完成度99,是因为有一道题目收费,没有做!哈哈哈!)以下所有题目都是用Python3实现的。 下面是对这些题目按照算法进行分类整体,主要包括排序、哈希表、递归\回溯、链表、双指针、动态规划、二分查找、贪心、树、深度优先搜索、广度优先搜索等。 在整理之前,先学习一下Python的基本数据类型有哪些,请

qq_36561737的博客 4758

第3题 力扣LeetCode 热题 HOT 100(394. 字符串解码)

第3题 力扣LeetCode 热题 HOT 100(394. 字符串解码) 题目 394. 字符串解码 难度中等841收藏分享切换为英文接收动态反馈 给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。 此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,

weixin_45440200的博客 422

LeetCode hot 100—字符串解码

给定一个经过编码的字符串,返回它解码后的字符串。编码规则为:,表示其中方括号内部的正好重复k次。注意k保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数k,例如不会出现像3a或2[4]的输入。

rigidwill的博客 558

【力扣Hot 100】栈

给定一个只包括'('')''{''}''['']'的字符串s,判断字符串是否有效。**输入:**s = “()”**输出:**true**输入:**s = “()[]{}”**输出:**true**输入:**s = “(]”**输出:**false**输入:**s = “([])”**输出:**true'()[]{}'

欢迎 725

力扣hot100-->栈/单调栈

/ 如果栈为空,或者栈顶元素与当前闭括号不匹配,则说明括号序列无效,返回false。// 如果当前字符是闭括号,检查栈是否为空或者栈顶元素是否与当前闭括号匹配。// 如果当前字符是开括号'[',则将对应的闭括号']'推入栈中。// 如果当前字符是开括号'{',则将对应的闭括号'}'推入栈中。// 遍历结束后,如果栈为空,则说明所有开括号都找到了匹配的闭括号,返回true。// 如果当前字符是开括号'(',则将对应的闭括号')'推入栈中。// 如果栈不为空,则说明有未匹配的开括号,返回false。

Dong雨的博客 1055

LeetCode 热题 HOT 100 题解(仅记录解题思路)

由于数组中只有一个元素出现一次,其余元素都出现两次,因此用集合中的元素之和的两倍减去数组中的元素之和,剩下的数就是数组中只出现一次的数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。指针p1在头结点处,指针p2在头结点的next处,然后p1每次移动1格,p2则走2步,若在其中一个进入null之前两者指向同一结点,则代表有环。使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。

a131529的博客 1万+

hot100 394.字符串解码

(2)当s[i] == '['时,开启新一层递归,记录此[...]内字符串tmp和递归后的最新索引i,并执行res + multi * tmp拼接字符串。(b)cur_multi是当前 [ 到 ] 内字符串的重复倍数,例如“3[a2[c]]”中的2。(1)当s[i] == ']'时,返回当前括号内记录的res字符串与 ] 的索引i(更新上层递归指针位置)。(2)空间复杂度:O(N),辅助栈在极端情况下需要线性空间,例如2[2[2[a]]]。(c)进入到新 [ 后,res和multi重新记录。

m0_63814538的博客 316
上一篇: LeetCode Hot100(51/100)——155. 最小栈
下一篇: LeetCode Hot100(53/100)——739. 每日温度
梨梨(AI版)
博客等级 码龄8年 1万+粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梨梨(AI版)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值