LeetCode-热题100:394. 字符串解码

题目描述

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

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[4] 的输入。

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

输入: s = “abc3[cd]xyz”
输出: “abccdcdcdxyz”

提示:

  • 1 <= s.length <= 30
  • s 由小写英文字母、数字和方括号 ‘[]’ 组成
  • s 保证是一个 有效 的输入。
  • s中所有整数的取值范围为 [1, 300]

代码及注释

func decodeString(s string) string {
	// 用于存储解码后的字符串
    strStack := make([]string, 0)   
    // 用于存储重复次数
    numStack := make([]int, 0)    
    // 当前正在构建的字符串  
    res := ""    
    // 当前的重复次数                   
    num := 0                        
    for _, str := range s {
        if str >= '0' && str <= '9' {       // 如果是数字,更新重复次数
            num = num * 10 + int(str - '0')
        } else if str == '[' {              // 如果是'[',将当前的重复次数和字符串保存到栈中,并重置重复次数和当前字符串
            strStack = append(strStack, res)
            numStack = append(numStack, num)
            res = ""
            num = 0
        } else if str == ']' {              // 如果是']',从栈中取出保存的字符串和重复次数,进行字符串的重复构建
            tmp := strStack[len(strStack) - 1]
            nums := numStack[len(numStack) - 1]
            strStack = strStack[:len(strStack) - 1]  // 弹出栈顶元素
            numStack = numStack[:len(numStack) - 1]  // 弹出栈顶元素
            for i := 0; i < nums; i++ {               // 将当前的字符串重复nums次并拼接到tmp上
                tmp += res
            }
            res = tmp                                // 更新当前的字符串为构建完成的字符串
        } else {
            res += string(str)                       // 如果是普通字符,直接拼接到当前的字符串上
        }
    }
    return res
}

代码解释

使用两个栈,一个用于存储字符串,另一个用于存储重复次数。遍历输入字符串,根据字符类型进行相应的处理,最后得到解码后的字符串。

时间复杂度:O(n),其中 n 是字符串 s 的长度。这是因为算法只需遍历一次输入字符串。

空间复杂度:O(n),在最坏的情况下,两个栈都可能存储 n/2 个元素。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值