1. 程式人生 > 其它 >leetcode字串解碼

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