python-leetcode 70.字符串解码

题目:

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

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

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

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


这个问题类似于解析嵌套的括号表达式,需要栈来处理嵌套的结构。遇到数字时,需要解析出完整的数字,因为数字可能不止一位。遇到 [ 时,开始记录需要重复的字符串。遇到 ] 时,将栈顶的数字和字符串弹出,进行重复操作,并将结果和前面的字符串合并。

思路:

初始化:存储之前的字符串和数字,字符串正在解析的字符串,以及正在解析的数字

遍历字符串:

如果是数字,更新当前的数字;

如果是[ 将当前的字符串和数字压入栈中,并重置;

如果是 ] 弹出栈顶的字符串和数字,将字符串重复num次并于之前的字符串进行拼接

如果是字母,直接添加到当前字符串

class Solution(object):
    def decodeString(self, s):
        """
        :type s: str
        :rtype: str
        """
        stack=[]  #用于保存遇到 [ 时的当前字符串和数字
        current_string="" #当前正在构建的字符串
        current_num=0  #当前正在解析的数字
    
        for char in s:
            if char.isdigit():  #如果字符char是数字(0-9)
                current_num=current_num*10+int(char)  #处理多位数,比如 "123" 会依次解析为 1 → 12 → 123
            elif char=="[":
                stack.append((current_string,current_num))
                current_string=''
                current_num=0
            elif char=="]":
                previous_string,num=stack.pop()#从栈中弹出之前保存的字符串和数字
                current_string=previous_string+current_string*num#将当前字符串重复 num 次,并附加到 previous_string 后面
            else:#如果当前字符是字母
                current_string+=char
        return current_string #当遇到 [ 就保存当前状态,遇到 ] 就弹出状态并处理重复
        

时间复杂度:O(n),n是解码后的字符串长度,每个字符最多被处理一次

空间复杂度:O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值