import java.util.*;
/**
* NC199 字符串解码
* @author d3y1
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return string字符串
*/
public String decodeString (String s) {
// return solution1(s);
return solution2(s);
}
/**
* 递归
*
* 类似 -> HJ50 四则运算
*
* @param s
* @return
*/
private String solution1(String s){
int len = s.length();
StringBuilder result = new StringBuilder();
char ch;
int num = 0;
String part;
for(int i=0; i<len; i++){
ch = s.charAt(i);
if(Character.isDigit(ch)){
num = num*10 + (ch-'0');
}
if(ch == '['){
int count = 1;
char next;
int j;
for(j=i+1; j<len&&count>0; j++){
next = s.charAt(j);
if(next == '['){
count++;
}
if(next == ']'){
count--;
}
if(count == 0){
break;
}
}
part = decodeString(s.substring(i+1, j));
while(num > 0){
result.append(part);
num--;
}
i = j;
}
if(Character.isLetter(ch)){
result.append(ch);
}
}
return result.toString();
}
/**
* 栈
* @param s
* @return
*/
private String solution2(String s){
Stack<Integer> numStack = new Stack<>();
Stack<String> resStack = new Stack<>();
StringBuilder result = new StringBuilder();
int len = s.length();
char ch;
int num = 0;
for(int i=0; i<len; i++){
ch = s.charAt(i);
if(Character.isDigit(ch)){
num = num*10 + (ch-'0');
}
if(ch == '['){
numStack.push(num);
num = 0;
resStack.push(result.toString());
result = new StringBuilder();
}
if(Character.isLetter(ch)){
result.append(ch);
}
if(ch == ']'){
int times = numStack.pop();
StringBuilder part = new StringBuilder(resStack.pop());
for(int j=1; j<=times; j++){
part.append(result);
}
result = part;
}
}
return result.toString();
}
}