Given an encoded string, return it's decoded string.
The encoding rule is: k[encoded_string]
, where the encoded_string inside the square brackets is being repeated exactly k times. Note that k is guaranteed to be a positive integer.
You may assume that the input string is always valid; No extra white spaces, square brackets are well-formed, etc.
Furthermore, you may assume that the original data does not contain any digits and that digits are only for those repeat numbers, k. For example, there won't be input like 3a
or 2[4]
.
Examples:
s = "3[a]2[bc]", return "aaabcbc". s = "3[a2[c]]", return "accaccacc". s = "2[abc]3[cd]ef", return "abcabccdcdcdef".
参考了网上的算法,自己实现的时候也是用栈做的但是一直没有实现出来,感觉自己的思路还是不是很清晰。
3[a2[c]]
以这个为例,说一下算法的执行过程
public String decodeString(String s) {
if(s == null || s.length() == 0){
return "";
}
String res = "";
Stack<Integer> countStack = new Stack<Integer>();
Stack<String> resStack = new Stack<String>();
int i = 0;
while(i<s.length()){
if(Character.isDigit(s.charAt(i))){
//可能是一个》10的数字
int count = 0;
while(Character.isDigit(s.charAt(i))){
count = count * 10 + (s.charAt(i)-'0');
i++;
}
countStack.push(count);
}else if(s.charAt(i) == '['){
resStack.push(res);
res = "";
i++;
}else if(s.charAt(i) == ']'){
StringBuffer sb = new StringBuffer(resStack.pop());
int times = countStack.pop();
for(int x=0;x<times;x++){
sb.append(res);
}
res = sb.toString();
i++;
}else{
//如果是string, 那么继续加
res += s.charAt(i);
i++;
}
}
return res;
}