题目浅析

  • 想查看原题可以点击题目链接

  • 简单地说,就是给一个字符串,对于其中 3[*] 的部分,就替换成 *** 这样把中括号内部重复 3 遍,前面的数字部分可以为 1-300 的任意整数。

思路分享

  • 一开始的思路是对于[]的内部直接延长为数字倍数,但发现这个思路不太好应对多层嵌套。

  • 于是,如果用栈记录每层的字符情况以及要乘的数字倍数情况,然后在括号结束时计算倍数,就可以解决嵌套的问题。

  • 不过这里记录一个 Python 有趣的知识,对于 l = ["1", "2"] 这样的列表,用 l[-1] += l.pop() 的结果是什么呢?这个代码的原本目标是去除最后的一个元素,并将内容与前一个字符串融合,即目标答案是 [“12”]。但实际上却是 [“22”]。原因是虽然表达式是右到左来解析,但左边的 l[-1] 的“值”在式子一开始就是固定的,十分微妙,不知道算 bug 还是什么。(3.12.2)只能说各位实际上写的时候,尽量避免 -1 和 pop 这种比较相关的操作同时运行。

  • 灵神的题解一如既往的神啊,参考题解与灵神的栈思路类似

    https://leetcode.cn/problems/decode-string/solutions/3744428/di-gui-yong-zhan-mo-ni-di-gui-pythonjava-kcsv/

代码解答(强烈建议自行解答后再看)

  • 参考题解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution:
def decodeString(self, s: str) -> str:
count_rec = list()
left_rec = list()
contents = [""]
count = 0
for i, x in enumerate(s):
if x == '[':
count_rec.append(count)
# left_rec.append(i)
count = 0
contents.append("")
elif x == ']':
tmp = contents.pop() * count_rec.pop()
contents[-1] += tmp
elif x.isdigit():
count *= 10
count += int(x)
else:
contents[-1] += x
# print(contents)
# print(count_rec)
# print()
# print(contents)
return contents[0]