给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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".
本题直观上是比较复杂的,括号还套括号,比较难以处理,因此我们先分析一下本题该如何做。我们当遇见括号的时候,肯定要把括号内的括号先给处理掉,否则你重复k次还重复的是有数字有括号的内容,因此我们要先处理括号内部的,是不是想到了栈,先处理后面再处理前面。
如果是使用栈的话,方法就是遍历字符串
1、遍历到数字,就继续往后遍历直到没有数字,然后把数字计算出来存入栈中。
2、遍历到字母或者[,直接压入栈中。
3、遍历到],开始出栈,注意要反着出,直到遇见[,为止,然后取出数字,将这些已经出的字母重复数字的次数,继续亚入栈中。
遍历完毕后,直接把栈中的所有字符串拼接,注意一定是反着拼接的,答案就是拼接完毕的字符串了。
思路很清晰,代码也不难写,关键是处理字符串的细节,字母字符的转化,数字字符串的转化,字符串转成数字,各种细节需要细心处理。
代码如下:
class Solution {
public String decodeString(String s) {
Stack<String> stack = new Stack<String>();
int i = 0;
while (i < s.length()){
char ch = s.charAt(i);
//当当前字母是数字直接处理所有数字
if (Character.isDigit(ch)){
int num = 0;
while (Character.isDigit(ch)){
num = num * 10 + (ch - '0');
i++;
ch = s.charAt(i);
}
stack.push("" + num);
}
//当是字母或者是[直接入栈
else if (ch == '[' || Character.isLetter(ch)){
stack.push("" + ch);
i++;
}
//当时]开始出栈
else {
String res = "";
String r = "";
String temp = stack.pop();
while ( !temp.equals("[")){
res = temp + res;
temp = stack.pop();
}
temp = stack.pop();
int count = Integer.valueOf(temp);
for (int c = 0; c < count; c++){
r += res;
}
stack.push(r);
i++;
}
}
String ans = "";
while ( !stack.isEmpty() ){
ans = stack.pop() + ans;
}
return ans;
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。