今天的题目如下所示:
看到这道题的时候有一种似曾相识的感觉,在二月份学数据结构的时候自己写过一个表达式求值的函数,感觉跟这个类似,于是乎就动手,用栈来解决这个问题!
说起来这个用栈来求解的话,思路很简单,遇到[的时候,把它压入栈,然后存储数字和字符,等到遇到]的时候,就把[弹出栈,然后处理数字和字符。
以下是代码:
class Solution:
def decodeString(self, s: str) -> str:
#用栈来解决问题
stack = []
cache = []
result = ''
str_len = len(s)
i = 0
before = 0
while i < str_len:
if s[i] in "[]":
if s[i] == "[":
before = 1
stack.append("[")
elif s[i] == "]":
before = 0
stack.pop()
if stack != []:
alp = cache.pop(-1)
num = cache.pop(-1)
if cache[-1][0] in "1234567890":
cache.append(int(num)*alp)
else:
cache[-1] += int(num)*alp
else:
alp = cache.pop(-1)
num = cache.pop(-1)
result += int(num)*alp
i += 1
elif s[i] in "1234567890":
if before == 2:
cache[-1] += s[i]
else:
cache.append(s[i])
before = 2
i += 1
elif s[i] in "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM":
if before == 3:
cache[-1] += s[i]
elif before == 0:
if stack != []:
cache[-1] += s[i]
else:
result += s[i]
else:
cache.append(s[i])
before = 3
i += 1
return result
这个问题说简单是简单,因为就是分情况讨论,但是似乎也没有想象中那么简单,因为写着写着发现要讨论的情况还挺多的,我也是在几次踩坑之后才慢慢把代码完善好的。
情况1
在括号里面我没有考虑到会直接在]后面接一个字母,然后就加了一段代码解决了这个问题。
elif before == 0:
if stack != []:
cache[-1] += s[i]
else:
result += s[i]
情况2
我没有考虑到括号里面开头的竟然又是一个数字,于是乎又加了一段代码解决了这个问题。因为在我设想的情况里面,存储数字和字母的列表应该是数字和字母交替出现,为了达到这个效果,就需要判断一下列表里面最后的那个元素是字母还是数字,如果是数字,那么就要生成一个字母字符串加上去,否则就是要在原来的基础之上延长。
if cache[-1][0] in "1234567890":
cache.append(int(num)*alp)
else:
cache[-1] += int(num)*alp
由于leetcode测试案例总会出现一些奇奇怪怪的东西,所以还是得多提交几次才知道自己有哪些遗漏😶
由于我的代码太长了,且效率也不高,于是乎看了一下评论区,发现有一个也是用栈的方法来写的,代码比我的简洁好多,就po上来欣赏一下:
栈处理
还有一个更神奇的方法,是用正则表达式实现的,由于我还没怎么接触过正则表达式,于是就也po上来欣赏一下😀:
正则表达式处理