网络异常,图片无法展示
|
题目地址(394. 字符串解码)
题目描述
给定一个经过编码的字符串,返回它解码后的字符串。 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。 此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[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"
思路
通过一个临时栈,从]符号开始倒数栈内的字符串然后进行拼接处理
代码
- 语言支持:Python3
Python3 Code:
class Solution: def decodeString(self, s: str) -> str: sList = list(s) stack = list() res = "" while len(sList) != 0: i = sList.pop(0) # print(i) if i == "]":#出栈 tempStr = ""#找出栈内最后一个[]内的字符串 while True: j = str(stack.pop()) if j.isalpha() == True: tempStr = j + tempStr elif j == "[": break tempInt = ""#找出栈内最后一个连续数字 # print(stack, tempStr, tempInt,"-") while True: try: k = stack.pop() if k.isnumeric() == True: tempInt = k + tempInt else: stack.append(k)#如果是非数字,再次入栈 break except:#用于边界条件【其实不稳固】 break # print(stack,tempStr,tempInt) stack.append(tempStr*int(tempInt)) # print(stack) else: stack.append(i) # print(stack) return "".join(stack) if __name__ == '__main__': # s = "3[a]2[bc]" # s = "3[a2[c]]" # s = "2[abc]3[cd]ef" # s = "abc3[cd]xyz" s = "100[leetcode]" result = Solution().decodeString(s) print(result)
复杂度分析
令 n 为数组长度。
- 时间复杂度:O(nlogn)O(nlogn)
- 空间复杂度:O(n)O(n)