字符串解码:
样例:
s = “3[a]2[bc]”, 返回 “aaabcbc”.
s = “3[a2[c]]”, 返回 “accaccacc”.
s = “2[abc]3[cd]ef”, 返回 “abcabccdcdcdef”
方法1:递归
方法2:栈
//方法1:DFS
public static String decodeString(String s){
char[] chs = s.toCharArray();
return dfs(chs,0)[0];
}
public static String[] dfs(char[] chs,int idx){
int multi = 0; //倍数 倍数可能是3 也可能是32
StringBuffer res = new StringBuffer();
while(idx<chs.length){
char ch = chs[idx];
if(ch=='['){ //进入新的递归
String[] tmp = dfs(chs,idx+1);
idx = Integer.parseInt(tmp[0]);
while(multi>0){
res.append(tmp[1]);
multi--;
}
}else{
if(ch==']'){
return new String[]{String.valueOf(idx),res.toString()};
}else{
if(ch>='0'&&ch<='9'){
multi=multi*10+Integer.parseInt(String.valueOf(ch));
}else{
res.append(String.valueOf(ch));
}
}
}
idx++;
}
return new String[]{res.toString()};
}
方法2:栈
public static String decodeString(String s){
char[] chs = s.toCharArray();
int multi = 0;
Stack<Integer> stMulti = new Stack<>(); //保存当前mutli倍数
Stack<String> stStr = new Stack<>(); //保存当前res字符串
StringBuffer res = new StringBuffer();
for(char ch:chs){
if(ch>='0' && ch<='9'){
multi=multi*10+Integer.parseInt(String.valueOf(ch));
}else{
if(ch=='['){
stMulti.add(multi);
stStr.add(res.toString());
multi=0;
res=new StringBuffer();
}else{
if(ch==']'){
String str = stStr.pop();
int n = stMulti.pop();
StringBuffer sb = new StringBuffer();
while(n>0){
sb.append(res);
n--;
}
res=new StringBuffer(str+sb);
}else{
res.append(String.valueOf(ch));
}
}
}
}
return res.toString();
}