题目:字符串解码
题目来源:Leetcode
此题由于保证了输入一定是有效的,因此我们可以不必考虑括号失配的情形。
由于存在括号嵌套的情况,因此我们不能简单的从左到右匹配输出,而是存在内层括号时,我们应该先算出内层括号中的字符串解码然后再由外层计算,这显然很符合栈 “先进后出”的特性。
对输入字符串s进行遍历,有如下情形:
- 当前字符为数字,那么我们将其累加起来,用做其后【…】字符串出现的次数
- 当前字符为普通字符,我们用一个临时结果集先将其连接
- 当前字符为 “【”,显然此时我们要进入括号内层了,所以进内层前,我们将之前的倍数和之前的临时结果集先放入栈中,根据栈的特性,我们会先算完内层才会计算外层
- 当前字符为 “】”,此时,表示当前某一内层【…】已匹配完,我们向上弹出,将入括号上的倍数*【…】该括号内的内容并加上之前的临时结果集即可
栈实现的代码如下:
def decodeString(self, s: str) -> str:
stack, res, count = [], '', 0
for c in s:
if '0' <= c <= '9':
count = count*10 + int(c)
# 出现左括号进栈时,同时将当前的结果集和倍数也入栈,
# 然后将当前结果集和倍数清0,开始内层匹配
elif c == '[':
stack.append([res, count])
res, count = '', 0
# 出现右括号出栈时,还要加上进栈前的结果集
elif c == ']':
tmpRes, tmpCount = stack.pop()
res = tmpRes + tmpCount * res
else:
res += c
return res
递归实现思路和栈差不多:
- 我们设置一个pos指针,初始指向第一个字符
- 当出现 “【”时,开启下一层递归
- 出现 “】”时,向上返回一层,同时返回此时的pos指针位置
def decodeString_dfs(self, s: str) -> str:
def dfs(pos):
res, count = '', 0
while pos < len(s):
if '0' <= s[pos] <= '9':
count = count * 10 + int(s[pos])
elif s[pos] == '[':
tmp_res, pos = dfs(pos+1)
res += tmp_res * count
count = 0
elif s[pos] == ']':
return res, pos
else:
res += s[pos]
pos += 1
return res
return dfs(0)