leetcode394. 字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例:
s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".
方法:栈
思路:
本题的难点在于存在括号重叠的情况,比如第二个示例,如果都是第一个示例一样,那么很好解答。出现第二个示例这种情况,需要考虑[c]这个括号元素复制之后,还需要与前面的a一起,进行下一次复制。第一个括号“[”先进后出,这与栈结构一致,所以我们使用堆栈结构解决这个问题。
我们使用ans维护答案,numm维护遍历到的这个括号前面的数,stack堆栈保存一个个数组[numm,ans],numm为这个括号前面的数,ans为到这个括号前的答案,方便之后进行拼接,因为只有括号内部的字符才会被复制,而且如果遇到示例2那种情况,c是需要复制的,相对于这个括号来说,a不需要复制,但是a相对于外面的括号,是需要复制的,所以我们需要使用ans来保存,而不能使用别的变量,因为你不知道ans需不需要复制,遇到右括号,就需要复制。我们遍历字符串s,每个字符设为c
当我们遇到数字的时候:我们对numm进行更新,numm * 10 + c
当我们遇到左括号的时候:这时,说明后面的需要复制了,入栈[numm,ans],然后numm = 0;ans = '',清零。
当我们遇到字符时:这时是需要复制的字符串,ans += c
当我们遇到右括号的时候:这时,需要完成复制了,对最后入栈的弹出,temp = stack.pop(),ans = temp[0] * ans + temp[1]
最后返回ans即可。
下面以实例二为例,画图解释。
代码:
class