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();
    }
}

 

posted @ 2022-03-05 21:20  小丑一条街  阅读(63)  评论(0)    收藏  举报