Leetcode 394.字符串解码
1 题目描述(Leetcode题目链接)
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: ,表示其中方括号内部的 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".
2 题解
根据题目分析,我的第一想法是用栈来做,需要对各种情况思考得仔细一些,写起来貌似还有些麻烦。
class Solution:
def decodeString(self, s: str) -> str:
stack = []
retv = ""
num = 0
for char in s:
print(stack)
if not stack and char.isalpha():
retv += char
elif char.isdigit():
num = num*10 + int(char)
elif char == '[':
stack.append(num)
stack.append(char)
num = 0
elif stack and char.isalpha():
if stack[-1].isalpha():
stack[-1] += char
else:
stack.append(char)
elif char == ']':
seq = stack.pop()
stack.pop()
times = stack.pop()
seq = seq*times
if not stack:
retv += seq
continue
if stack[-1] != '[':
stack[-1] += seq
else:
stack.append(seq)
return retv
也可以用递归来做。
class Solution:
def decodeString(self, s: str) -> str:
def dfs(s, i):
retv = ""
num = 0
while i < len(s):
if s[i].isalpha():
retv += s[i]
elif s[i].isdigit():
num = num*10 + int(s[i])
elif s[i] == '[':
target, i = dfs(s, i+1)
retv += num*target
num = 0
elif s[i] == ']':
return retv, i
i += 1
return retv
return dfs(s, 0)
排名靠前的题解如下。
class Solution:
def decodeString(self, s: str) -> str:
res = ""
stk = []
cnt = ""
for ch in s:
if ch == '[':
stk.append([int(cnt), ""])
cnt = ""
elif ch == ']':
cur_res = stk.pop()
if stk:
stk[-1][1] += cur_res[0] * cur_res[1]
else:
res += cur_res[0] * cur_res[1]
elif '0' <= ch <= '9':
cnt += ch
else:
if stk:
stk[-1][1] += ch
else:
res += ch
return res