给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: (encoded_string)[k],表示其中括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的括号总是符合格式要求的。
示例 1:
输入:s = “(a) [3] (bc) [2]”
输出:“aaabcbc”
示例 2:
输入:s = “(a( c )[2]) [3]”
输出:“accaccacc”
思路:
这道题其实思路并不难想,因为很容易知道要用栈来解决,但是细节处会有很多不少地方要去注意和深究,首先是栈的使用,很多人会用两个栈,一个数字栈,一个字符串栈,我这里的解法就只用一个栈,因为只用一个栈,所以不是字符栈,而是字符串栈stack
读到)时,用一个while循环将(和)之间的字符串读出,我这里用了StringBuffer来提高字符串拼接性能,读出后将(pop删去,然后开始读数字num了,注意数字可能是很多位数字,这里处理方法很多,我就直接用parseInt将字符串转化为数字了,然后是将上述字符串复制num倍,这样处理后再将字符串放回栈中即可,至于其他情况,直接将其转化为字符串压入栈中即可,最后出栈的时候要注意,字符串的总体顺序是反的,故要用insert拼接而不是append
直接上代码:
public String decodeString(String s) {
StringBuffer sb = new StringBuffer();
Stack<Character> stack = new Stack<>();
for (int i = 0; i != s.length(); i++) {
char c = s.charAt(i);
stack.push(c);
if (c == ']') {
char n;
String repeated = "";
stack.pop();
while ((n = stack.pop()) != '[') {
repeated = n + repeated;
}
int repeatedNum = Integer.valueOf(repeated);
stack.pop();
String repeatedStr = "";
while ((n = stack.pop()) != '(') {
repeatedStr = n + repeatedStr;
}
for (int j = 0; j != repeatedNum; j++) {
char[] chars = repeatedStr.toCharArray();
for (char c1 : chars) {
stack.push(c1);
}
}
}
}
while (!stack.isEmpty()) {
sb.insert(0, stack.pop());
}
return sb.toString();
}