leetcode字符串解码
栈的运用。--》一个栈用于保存数字判断用于重复,另一个字符串判断【】用于插入标记。
class Solution {
/**
我的想法:
把字符全部放入StringBuffer中,括号用int字符标记
次数放入栈里面。单位为你太【number,flag】;
*/
public String decodeString(String s) {
StringBuffer sb = new StringBuffer();
Stack<Integer> si = new Stack();
Stack<int[]> stack = new Stack();
int flag = 0;
for(int i=0;i<s.length();i++){
char tmp = s.charAt(i);
if(tmp>='0'&&tmp<='9'){
int i1 = 0;
while(s.charAt(i+i1)>='0'&&s.charAt(i+i1)<='9'){
// System.out.println(tmp+i1);
i1++;
}
stack.push(new int[]{
Integer.valueOf(s.substring(i,i+i1)),flag});
i=i+i1-1;
}else if(tmp=='['){
si.push(flag);
sb.append(flag);
flag++;
}else if(tmp==']'){
sb.append(si.pop());
}else{
sb.append(tmp);
}
}
while(!stack.isEmpty()){
//tmp的0是次数。1是flag标记的位置。
int[] tmp = stack.pop();
//定义左右flag的位置
int left = sb.indexOf(String.valueOf(tmp[1]));
int right = sb.lastIndexOf(String.valueOf(tmp[1]));
//截取字符串加入到指定位置
String add = sb.substring(left+1,right);
for(int i=1;i<tmp[0];i++){
sb.insert(right,add);
}
//刷新右指针的位置
right = sb.lastIndexOf(String.valueOf(tmp[1]));
//删除标记
sb.deleteCharAt(left);
sb.deleteCharAt(right-1);
}
return sb.toString();
}
}
浙公网安备 33010602011771号