[特殊字符] 力扣热题 394:字符串解码(详细解析)(Go语言版)

news/2025/3/25 23:42:19/

🚀 力扣热题 394:字符串解码(详细解析)

📌 题目描述

力扣 394. 字符串解码

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为:k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。你可以认为 k 总是一个正数。

注意:输入字符串中只包含数字、英文字母、方括号 [] 和不会嵌套的数字。

🌟 示例 1:

输入:s = "3[a]2[bc]"
输出:"aaabcbc"

🌟 示例 2:

输入:s = "3[a2[c]]"
输出:"accaccacc"

🌟 示例 3:

输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"

💡 解题思路

✅ 栈结构(Stack)解法

这是一个经典的 栈应用题,核心思路是:

  • 遇到 [ :将当前数字(重复次数)和字符串入栈。
  • 遇到 ] :弹出栈顶元素,构造新字符串。
  • 遇到字母:追加到当前字符串中。

我们维护两个栈:

  1. 数字栈:存储重复次数。
  2. 字符串栈:存储括号外的字符串。

💻 Go 实现代码

✅ 方法一:使用两个栈

func decodeString(s string) string {numStack := []int{}strStack := []string{}currStr := ""num := 0for _, ch := range s {if ch >= '0' && ch <= '9' {num = num*10 + int(ch-'0')} else if ch == '[' {numStack = append(numStack, num)strStack = append(strStack, currStr)num = 0currStr = ""} else if ch == ']' {repeat := numStack[len(numStack)-1]numStack = numStack[:len(numStack)-1]prevStr := strStack[len(strStack)-1]strStack = strStack[:len(strStack)-1]temp := ""for i := 0; i < repeat; i++ {temp += currStr}currStr = prevStr + temp} else {currStr += string(ch)}}return currStr
}

✅ 方法二:递归解法

另一种常见的解法是使用递归。递归的思想是将当前字符串按照解码规则拆解,每次遇到 ] 就进行一层解码,然后返回结果。我们通过递归调用来处理字符串中的每一部分。

递归思路:

  • 遇到数字时,开始收集数字,表示重复次数。
  • 遇到 [ 时,递归解析其中的字符串,并将解码后的部分乘以数字。
  • 遇到 ] 时,返回当前的结果并将结果拼接到之前的解码字符串中。

步骤:

  • 遇到字母,直接拼接到当前的解码字符串。
  • 遇到数字,记录并构建重复次数。
  • 遇到 [ 时,开始递归调用处理括号内的字符串。
  • 遇到 ] 时,返回当前解析的结果并继续处理外部字符串。

✅ 方法二:递归解法

func decodeString(s string) string {index := 0return decodeHelper(s, &index)
}func decodeHelper(s string, index *int) string {res := ""for *index < len(s) {ch := s[*index]if ch >= '0' && ch <= '9' {num := 0for *index < len(s) && s[*index] >= '0' && s[*index] <= '9' {num = num*10 + int(s[*index]-'0')*index++}*index++ // skip '['str := decodeHelper(s, index)*index++ // skip ']'for i := 0; i < num; i++ {res += str}} else if ch == ']' {return res} else {res += string(ch)*index++}}return res
}

【比较分析】

方法特点处理步骤处理嵌套性应用场景
栈解法简洁直观,便于理解递渐构造字符串支持嵌套适合初学者
递归解法逻辑清晰,方便处理嵌套结构循环解析,函数循环构造结果更适合深度嵌套规则高级结构处理

⏳ 复杂度分析

操作时间复杂度空间复杂度
栈/递归 O ( n ) O(n) O(n) O ( n ) O(n) O(n)
  • n 是字符串长度,遍历一遍,各步操作均为常数时间
  • 空间用于栈或递归调用的结果缓存

🌟 总结

  • 栈和递归都是解决本题的有效途径
  • 栈解法更加简单直观,适合初学和面试习题
  • 递归解法适合处理庞复的嵌套规则,优雅简洁

💡 成熟掌握两种思路,能使你展现多样化的解题技巧。


http://www.ppmy.cn/news/1583078.html

相关文章

【web3】

检测钱包是否安装 方法一 // npm install metamask/detect-provider import detectEthereumProvider from metamask/detect-provider// 检测钱包是否安装 const isProvider await detectEthereumProvider() if(!isProvider) {proxy.$modal.msgError("请安装钱包")…

datawhale组队学习--大语言模型—task4:Transformer架构及详细配置

第五章 模型架构 在前述章节中已经对预训练数据的准备流程&#xff08;第 4 章&#xff09;进行了介绍。本章主 要讨论大语言模型的模型架构选择&#xff0c;主要围绕 Transformer 模型&#xff08;第 5.1 节&#xff09;、详细 配置&#xff08;第 5.2 节&#xff09;、主流架…

Idea中使用Git插件_合并当前分支到master分支_冲突解决_很简单---Git工作笔记005

由于之前用svn习惯了,用的git少,其实在idea中使用git,解决冲突,合并分支,非常的简单,一起来看一下吧. 一定要注意操作之前,一定要确保自己的分支代码,都已经commit提交了,并且push到远程了. 不要丢东西. 可以看到首先,在idea的左下角有个 git,点开以后 可以看到有显示的分支…

大型语言模型(LLM)推理框架的全面分析与选型指南(2025年版)

原创 AI安全工坊 AI安全工坊 2025年02月27日 16:22 江苏 1. 引言 大型语言模型&#xff08;LLM&#xff09;已成为驱动智能客服、内容创作、代码生成等领域变革的核心力量。推理框架作为LLM高效部署的关键组件&#xff0c;直接关系到应用的性能、成本和开发效率。为帮助读者…

DeepSeek高校教程大合集(清华,北大,浙大,夏大,天大,湖大,天大,北师大),持续更新

大家好&#xff0c;我是吾鳴。 自从DeepSeek爆火之后&#xff0c;吾鳴就一直在收集和整理关于DeepSeek的教程报告等资料&#xff0c;也收集了有一个多月了。但是有粉丝朋友反馈说&#xff0c;有点凌乱&#xff0c;细找比较麻烦。于是乎吾鳴基于金山文档建设了一个比较简陋的资源…

Python网络编程入门

一.Socket 简称套接字&#xff0c;是进程之间通信的一个工具&#xff0c;好比现实生活中的插座&#xff0c;所有的家用电器要想工作都是基于插座进行&#xff0c;进程之间要想进行网络通信需要Socket&#xff0c;Socket好比数据的搬运工~ 2个进程之间通过Socket进行相互通讯&a…

常见框架漏洞--Spring

Spring Data Rest 远程命令执⾏命令(CVE-2017-8046) 环境搭建 漏洞利用 1. 访问 http://your-ip:8080/customers/1 2.然后抓取数据包&#xff0c;使⽤PATCH请求来修改 [{ "op": "replace" , "path": "T(java.lang.Runtime).getRuntime().…

Apache Hive:基于Hadoop的分布式数据仓库

Apache Hive 是一个基于 Apache Hadoop 构建的开源分布式数据仓库系统&#xff0c;支持使用 SQL 执行 PB 级大规模数据分析与查询。 主要功能 Apache Hive 提供的主要功能如下。 HiveServer2 HiveServer2 服务用于支持接收客户端连接和查询请求。 HiveServer2 支持多客户端…