LeetCode 热题 100 394. 字符串解码

LeetCode 热题 100 | 394. 字符串解码

大家好!今天我们来探讨一道非常有趣的算法题目——LeetCode 394. 字符串解码。这道题考察了我们对栈这种数据结构的理解和应用能力,同时也涉及到了字符串的处理技巧。接下来,我将详细地为大家解析这道题的解题思路和代码实现。

一、问题描述

题目要求我们给定一个经过编码的字符串,返回它解码后的字符串。编码规则为:k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。输入字符串总是有效的,且不会包含额外的空格。

二、解题思路

(一)栈的巧妙应用

这道题的关键在于利用栈来处理嵌套的解码问题。栈在这里起到了存储中间解码结果和重复次数的作用。通过栈,我们可以方便地处理多层嵌套的情况,确保在解码过程中不会出现混乱。

(二)遍历字符串,逐步解码

我们需要从左到右遍历整个输入字符串,根据遇到的不同字符类型,采取不同的处理策略:

  1. 遇到数字:我们需要将数字字符转换为整数,并将其存储起来,因为这表示接下来的字符串需要重复的次数。
  2. 遇到 [:这表示一个新的解码单元的开始。我们将当前的解码结果和重复次数作为一个元组压入栈中,然后重置当前的解码结果和重复次数,以便开始处理新的解码单元。
  3. 遇到 ]:这表示当前解码单元的结束。我们需要从栈中弹出最近的解码结果和重复次数,将当前的解码结果重复指定的次数,并将其拼接到弹出的解码结果后面。
  4. 遇到字母:直接将字母添加到当前的解码结果中。

(三)代码实现

接下来,我将给出详细的代码实现,并对代码中的关键部分进行解释。

class Solution(object):def decodeString(self, s):""":type s: str:rtype: str"""stack = []cur_str = ''cur_num = 0for string in s:if string.isdigit():cur_num = cur_num * 10 + int(string)elif string == '[':stack.append((cur_str, cur_num))cur_str, cur_num = '', 0elif string == ']':last_str, last_num = stack.pop(-1)cur_str = last_str + cur_str * last_numelse:  # 字母cur_str = cur_str + stringreturn cur_str

(四)代码解析

  1. 初始化

    • stack:用于存储解码过程中的中间结果和重复次数。
    • cur_str:用于存储当前的解码结果。
    • cur_num:用于存储当前的重复次数。
  2. 遍历字符串

    • 遍历输入字符串 s,逐字符处理每个字符 string

    处理数字

    • 如果 string 是数字,更新 cur_num
      cur_num = cur_num * 10 + int(string)
      
      这一步是为了处理多位数的情况。例如,对于字符串 "123",逐步解析为 112123

    处理 [

    • 如果 string[,将当前的解码结果和重复次数压入栈,并重置 cur_strcur_num
      stack.append((cur_str, cur_num))
      cur_str, cur_num = '', 0
      

    处理 ]

    • 如果 string],从栈中弹出最近的解码结果和重复次数,将当前解码结果重复指定次数,并拼接到弹出的解码结果后面:
      last_str, last_num = stack.pop(-1)
      cur_str = last_str + cur_str * last_num
      

    处理字母

    • 如果 string 是字母,直接将其添加到 cur_str
      cur_str = cur_str + string
      
  3. 返回最终结果

    • 遍历结束后,cur_str 即为最终的解码结果。

三、复杂度分析

  • 时间复杂度:O(n),其中 n 是输入字符串的长度。每个字符最多被处理两次(一次入栈,一次出栈)。
  • 空间复杂度:O(n),栈的深度最多为嵌套的层数,每层存储的字符串长度最多为 n。

四、总结

通过使用栈,我们可以高效地处理嵌套的解码问题。栈用于存储当前的解码结果和重复次数,通过逐字符解析输入字符串,我们可以逐步构建出最终的解码结果。这种方法不仅简单易懂,而且时间复杂度和空间复杂度都很低。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!

关注我,获取更多算法题解和编程技巧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/379.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解一下RabbitMQ中的channel.Publish

函数定义(来自 github.com/streadway/amqp) func (ch *Channel) Publish(exchange string,key string,mandatory bool,immediate bool,msg Publishing, ) error这个方法的作用是:向指定的交换机 exchange 发送一条消息 msg,带上路…

docker使用sh脚本创建容器,保持容器正常运行,异常关闭后马上重启

docker run -d --name dadeName \--memory5120m \-p 40060:80 \-p 40061:3306 \-v "$data:$dockerData" \-v "$img:$dockerImg" \--restartalways \ # 关键参数:总是重启dade:120 \/bin/bash -c "/www/start.sh && tail -f /dev/…

3516cv610在sample_aiisp上多创一路编码流,方法

3516cv610在sample_aiisp上多创一路编码流,方法 首先确保 vpss grp0有视频流 最好保证 已经有一路视频流能推出来 多创一路编码流思路为 将 vpss grp0又绑定给 vpss_chn1 vpss_chn1有绑定给 venc_chn1 这样我们就多创了一路视频流。 这里思路完全正确 可以实现…

Leetcode 3566. Partition Array into Two Equal Product Subsets

Leetcode 3566. Partition Array into Two Equal Product Subsets 1. 解题思路2. 代码实现 题目链接:3566. Partition Array into Two Equal Product Subsets 1. 解题思路 这一题我的实现还是比较暴力的,首先显而易见的,若要满足题目要求&…

waitpid的waitstatus 含义源码解读

当我们在调用pid_t waitpid(pid_t pid, int *stat_loc, int options)时,其中第二个参数stat_loc会提供子进程退出的详细信息,为此posix还提供了一组宏来解析这个status. 在\glibc\bits\waitstatus.h /* If WIFEXITED(STATUS), the low-order 8 bits of …

MATLAB实战:传染病模型仿真实现

以下是一个使用MATLAB实现传染病模型(SIR和SEIR)仿真的完整解决方案,包含参数分析和干预措施模拟: %% 传染病模型仿真工具箱 % 包含SIR、SEIR模型,支持参数调整和干预措施模拟 % 使用ode45求解微分方程 function epi…

系统架构设计师(一):计算机系统基础知识

系统架构设计师(一):计算机系统基础知识 引言计算机系统概述计算机硬件处理器处理器指令集常见处理器 存储器总线总线性能指标总线分类按照总线在计算机中所处的位置划分按照连接方式分类按照功能分类 接口接口分类 计算机软件文件系统文件类…

汽车安全:功能安全FuSa、预期功能安全SOTIF与网络安全Cybersecurity 解析

汽车安全的三重防线:深入解析FuSa、SOTIF与网络安全技术 现代汽车已成为装有数千个传感器的移动计算机,安全挑战比传统车辆复杂百倍。 随着汽车智能化、网联化飞速发展,汽车电子电气架构已从简单的分布式控制系统演变为复杂的移动计算平台。现…

GitHub 趋势日报 (2025年05月31日)

📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 1153 prompt-eng-interactive-tutorial 509 BillionMail 435 ai-agents-for-begin…

飞腾D2000与FPGA结合的主板

UD VPX-404是基于高速模拟/数字采集回放、FPGA信号实时处理、CPU主控、高速SSD实时存储架构开发的一款高度集成的信号处理组合模块,采用6U VPX架构,模块装上外壳即为独立整机,方便用户二次开发。 UD VPX-404模块的国产率可达到100%&#xff0…

前端面经 协商缓存和强缓存

HHTTPTTP缓存 协商缓存和强缓存 核心区别是否向服务器发起请求验证资源过期 强缓存 浏览器直接读取本地缓存,不发请求 HTTP响应头 Cache-Control:max-age3600资源有效期 Expires优先级低 如果有效浏览器返回200(浏览器换伪造的200) 应用静态资源 协商缓存 OK如果 1强缓…

【NLP 78、手搓Transformer模型结构】

你以为走不出的淤泥,也迟早会云淡风轻 —— 25.5.31 引言 ——《Attention is all you need》 《Attention is all you need》这篇论文可以说是自然语言处理领域的一座里程碑,它提出的 Transformer 结构带来了一场技术革命。 研究背景与目标 在 Transfo…