算法练习——字符串解码 leetcode.394 python

题目描述:

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

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

附上一个更详细的解答,也是本文学习的方法:

LeetCode 394. 字符串解码 | Python_"大梦三千秋的博客-CSDN博客_leetcode394根据栈先入后出的特性,来解决《394. 字符串解码》问题https://blog.csdn.net/weixin_45642918/article/details/106410336?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164758808616780357239172%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164758808616780357239172&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-2-106410336.142^v2^pc_search_result_control_group,143^v4^register&utm_term=leetcode394+python&spm=1018.2226.3001.4187

重要思想:

栈需要存储两个信息,一个是左括号前面的字符s,一个是左括号前面的数字num。

触发他们出栈的条件是——当有新的字符串被检测到,且检测到了末尾标志——“ ] ”,这时候就要在s的基础上,去拼接num倍的新字符串。

代码实现:

class Solution:
    def decodeString(self, string: str) -> str:
        # 辅助栈,每项存储两个信息,一个左括号前面的字符,一个左括号前面的数字
        stack = []
        # 用于数字真实值的计算
        num = 0
        # 用于存储在解码过程中产生的字符串
        s = ''

        for char in string:
            # 当字符是数字
            if char.isdigit():  # 可能不仅仅有一位
                num = num * 10 + int(char)  # 通过一串连续的数字字符推理出数字的值
            # 遇到左括号时,将前面的字符和数值入栈
            elif char == '[':
                stack.append((s, num))
                # 这里要重置存储这两项的变量!!!已经存储在栈中不必要担心数据丢失
                s = ''
                num = 0
            # 遇到右括号时,出栈
            elif char == ']':
                # 括号匹配的就近原则 栈顶的s、num(定义为front_char, cur_num)先出栈
                front_char, cur_num = stack.pop()
                # 解码
                s = front_char + cur_num * s
            # 遇到字符
            else:
                s = s + char
        return s

    class Stack:
        def __init__(self):
            self.items = []
        def isEmpty(self):
            return self.items == []
        def push(self, item):
            self.items.append(item)
        def pop(self):
            return self.items.pop()
        def peek(self): # 返回最后一个元素
            return self.items[len(self.items)-1]
        def size(self):
            return len(self.items)

举个例子模拟程序运行:

2[abc]3[cd]ef

step 1: 计算得到 num = 2

step2:遇到[,存储('',2)

step3:得到 s = abc

step4:遇到],运算数字加字符串,即为解码过程:得到abcabc,字符串变为abcabc3[cd]ef

step5:计算得到 num = 3

step6:遇到[, 存储(‘abcabc’,3)

step7:得到 s =  cd

step8:  遇到],运算数字加字符串,即为解码过程:得到abcabccdcdcd

step9:添加到s后面 得到abcabccdcdcdef

step10:遍历结束 return s

你可能感兴趣的:(python,leetcode,算法,python)