0394. 字符串解码
题目地址(394. 字符串解码)
https://leetcode-cn.com/problems/decode-string/
题目描述
前置知识
栈
括号匹配
使用栈
思路
题目要求将一个经过编码的字符解码并返回解码后的字符串。题目给定的条件是只有四种可能出现的字符
字母
数字
[
]
并且输入的方括号总是满足要求的(成对出现),数字只表示重复次数。
那么根据以上条件,可以看出其括号符合栈先进后出的特性以及递归的特质,稍后我们使用递归来解。
那么现在看一下迭代的解法。
我们可以利用 stack 来实现这个操作,遍历这个字符串 s,判断每一个字符的类型:
如果是字母 --> 添加到 stack 当中
如果是数字 --> 先不着急添加到 stack 中 --> 因为有可能有多位
如果是 [ --> 说明重复字符串开始 --> 将数字入栈 --> 并且将数字清零
如果是 ] --> 说明重复字符串结束 --> 将重复字符串重复前一步储存的数字遍
拿题目给的例子s = "3[a2[c]]"
来说:
在遇到 】
之前,我们不断执行压栈操作:
当遇到 】
的时候,说明我们应该出栈了,不断出栈知道对应的【
,这中间的就是 repeatStr。
但是要重复几次呢? 我们需要继续出栈,直到非数字为止,这个数字我们记录为 repeatCount。
而最终的字符串就是 repeatCount 个 repeatStr 拼接的形式。 并将其看成一个字母压入栈中。
继续,后面的逻辑是一样的:
(最终图)
代码
代码支持:Python
Python:
复杂度分析
时间复杂度:$O(N)$,其中 N 为解码后的 s 的长度。
空间复杂度:$O(N)$,其中 N 为解码后的 s 的长度。
递归
思路
递归的解法也是类似。由于递归的解法并不比迭代书写简单,以及递归我们将在第三节讲述。
主逻辑仍然和迭代一样。 只不过每次碰到左括号就进入递归,碰到右括号就跳出递归返回即可。
唯一需要注意的是,我这里使用了 start 指针跟踪当前遍历到的位置, 因此如果使用递归需要在递归返回后更新指针。
代码
复杂度分析
时间复杂度:$O(N)$,其中 N 为解码后的 s 的长度。
空间复杂度:$O(N)$,其中 N 为解码后的 s 的长度。
更多题解可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 37K star 啦。
大家也可以关注我的公众号《力扣加加》获取更多更新鲜的 LeetCode 题解
最后更新于