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".
思路一:DFS
public class Solution {
public String decodeString(String s) {
//DFS
int[] ind = new int[1];
return DFS(s,ind);
}
String DFS(String s, int[] ind){
StringBuilder result = new StringBuilder();
int num = 0;
while(ind[0]<s.length()){
char c = s.charAt(ind[0]);
//if digit, get the number
if(c>='0'&&c<='9'){
num = num*10 + (c-'0');
ind[0]++;
}
//if [ return DFS,combine with number, repeat, and add to result, make number as 0.
else if(c=='['){
//这里要先++,再接着while循环,所以不能统一把ind[0]++;放到最后,会多加一次
ind[0]++;
String temp = DFS(s,ind);
for(int i=0; i<num;i++){
result.append(temp);
}
num=0;
}
//if ] return result
else if(c==']'){
//这里要++,跳过],在返回
ind[0]++;
return result.toString();
}
//else add to result
else{
result.append(c);
ind[0]++;
}
}
return result.toString();
}
}
思路二:堆栈