【LeetCode 热题100】394:字符串解码(详细解析)(Go语言版)

150 阅读3分钟

🚀 LeetCode 热题 394:字符串解码(多种方法详解)


📌 题目描述

394. 字符串解码

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

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

输入字符串中可能存在嵌套的 k[encoded_string] 表达式。

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

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

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


💡 解题思路

这个题本质是对嵌套结构的解析,有两种经典的解法:

  • 解法一:使用两个栈 —— 适合迭代模拟解析过程,结构清晰。
  • 解法二:使用递归 DFS —— 利用函数递归处理嵌套,结构简洁,代码优雅。

✅ 解法一:栈模拟解码过程

🔧 思路:

  1. 初始化两个栈:
    • 数字栈:记录每次遇到 [ 前的重复次数 k
    • 字符串栈:记录每层解码前的字符串
  2. 遍历字符串:
    • 遇到数字:累积多位数字
    • 遇到 [:将当前数字和字符串压栈,重置
    • 遇到 ]:弹出数字和字符串,拼接重复结果
    • 遇到字符:追加到当前字符串

💻 Go 实现:

func decodeString(s string) string {
    numStack := []int{}
    strStack := []string{}
    currStr := ""
    num := 0

    for _, 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 = 0
            currStr = ""
        } else if ch == ']' {
            times := numStack[len(numStack)-1]
            numStack = numStack[:len(numStack)-1]

            prev := strStack[len(strStack)-1]
            strStack = strStack[:len(strStack)-1]

            temp := ""
            for i := 0; i < times; i++ {
                temp += currStr
            }
            currStr = prev + temp
        } else {
            currStr += string(ch)
        }
    }
    return currStr
}

✅ 解法二:递归解法(DFS)

🔧 思路:

利用递归函数模拟解码过程:

  • 从当前位置 i 开始解析
  • 遇到数字解析出 k
  • 进入递归,解析括号内的字符串
  • 遇到 ] 返回当前解码结果和位置
  • 字符串拼接返回

💻 Go 实现:

func decodeString(s string) string {
    i := 0
    return dfs(s, &i)
}

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

⏳ 复杂度分析

方法时间复杂度空间复杂度
栈解法O(n)O(n)
递归解法O(n)O(n)(递归栈空间)
  • n 为字符串长度。
  • 每个字符都只被处理一次。

📌 解法对比

解法优点缺点
栈模拟清晰直观,容易调试手动管理栈,代码略繁琐
递归 DFS简洁优雅,天然处理嵌套递归深度过大可能栈溢出

🧠 注意事项

  • 多位数字解析:10[a] 应正确解析为重复 10 次
  • 字母和数字交错出现的处理
  • 嵌套括号的递归调用与括号匹配问题
  • 指针或索引的控制要精确

🎯 总结

  • 本题属于 字符串嵌套解析类题目,是表达式求值、括号匹配等题型的典型代表。
  • 掌握两种解法可以应对不同场景:
    • 简单题推荐使用
    • 更复杂嵌套结构使用 递归 更简洁
  • 需要特别注意 多位数字解析括号控制逻辑

如果你觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐、关注 🧠!
我会持续更新高质量 LeetCode 热题解析,与你一起刷题成长!💪💻🔥

🎯 标签推荐字符串解析 递归 栈结构 中等题 面试高频