给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
解释:本题的难点和核心就在于它不仅可以中括号并排排放(2[as]3[er]),也可以中括号嵌套排放(3[a3[s]s])。对于第一种情况就很好解决,简单遍历就可以,关键是第二种情况该怎么办呢?
其实,这和我们见过的加减乘除运算的题是一个类型的。在加减乘除运算中,我们使用两个栈,一个栈存运算表达式中数字,一个栈存运算符,每取一个运算符就取两个数字,然后将计算得到的数字在放入到数字栈中,一直到数字栈和运算符栈都为空为止。这个题我们可以从中得到一点思路。
设想一下:
1、我们将输入字符串从第一个字符开始,入栈。当我们遇到 ‘]’ 时,就停止入栈,否则一直入栈。
2、当我们遇到右括号时,就让栈开始回退出栈,一直出到左括号为止,我们就可以找到第一个右括号以及其匹配的左括号中间的字符串。
3、然后在出栈就可以得到括号前面的数字N,也就是需要重复N次(注意:这个数字又可能是两位数哦,所以需要循环出栈,一直到不是数字为止)。
4、将这个字符串重复入栈N次。for循环,在循环内,将这个字符串变成字符数组,然后每次循环都将这个字符数组入栈一轮。
5、重复上面步骤,一直到输入字符串的最右边。
其实主旨就是,遇到右括号,就开始找它的左括号,计算两者之间字符串,在找左括号前数字,得到需要重复几次,得到重复几次后的字符串,将该字符串入栈,避免打乱顺序,保证该入栈字符串位置正确。如果不是右括号,就一直入栈,一直到原始字符串的最后即可。然后将该栈字符倒置形成字符串,就是结果。
class Solution{
public String decodeString(String s) {
Stack<Character> stack = new Stack