LeetCode 394:字符串解碼(棧)

題目

給定一個經過編碼的字符串,返回它解碼後的字符串。
編碼規則爲: k[encoded_string],表示其中方括號內部的 encoded_string 正好重複 k 次。注意 k 保證爲正整數。
你可以認爲輸入字符串總是有效的;輸入字符串中沒有額外的空格,且輸入的方括號總是符合格式要求的。
此外,你可以認爲原始數據不包含數字,所有的數字只表示重複的次數 k ,例如不會出現像 3a 或 2[4] 的輸入。

示例

s = “3[a]2[bc]”, 返回 “aaabcbc”.
s = “3[a2[c]]”, 返回 “accaccacc”.
s = “2[abc]3[cd]ef”, 返回 “abcabccdcdcdef”.
注意:重複次數不一定是個位數,而且可能存在括號嵌套,例如:“12[3[a]2[bc]]4[b]”

思路

我的思路很簡單,利用一個輔助棧來處理。具體邏輯見代碼註釋。

代碼

class Solution {
    public String decodeString(String s) {
        if(s==null||s.length()==0){
            return s;
        }
        char[] array = s.toCharArray();
        //一個輔助棧來存放字符
        LinkedList<Character> stack1 = new LinkedList<>();
        for(int i=0;i<array.length;i++){
            if(array[i]!=']'){
                //不是右括號直接入棧
                stack1.push(array[i]);
            }else{
                //當遇到右括號的時候,進行出棧等一系列處理

                StringBuilder ss = new StringBuilder();
                //ss存括號內的字符,遇到左括號停止
                while(stack1.peek()!='['){
                    ss.append(stack1.pop());
                }
                //把左括號彈出來
                stack1.pop();
                //計算重複次數(次數不一定是個位數,要注意處理)
                int num = 0;
                int count = 0;//記錄位數
                while(!stack1.isEmpty()&&stack1.peek()>='0'&&stack1.peek()<='9'){
                    num = num + (stack1.pop()-'0')*(int)Math.pow(10,count);
                    count++;
                }
                StringBuilder sb = new StringBuilder();
                //sb存重複後的字符串
                for(int j=0;j<num;j++){
                    sb.append(ss.toString());
                }
                //因爲棧是先進後出,所以要reverse一下,再入棧
                char[] temp = sb.reverse().toString().toCharArray();
                for(int m=0;m<temp.length;m++){
                    stack1.push(temp[m]);
                }
            }
        }
        //此時,字符串被解碼完畢,以字符的形式存在棧中,出棧即可
        StringBuilder res = new StringBuilder();
        while(!stack1.isEmpty()){
            res.append(stack1.pop());
        }
        //同樣,因爲棧是先進後出,所以要reverse一下
        return res.reverse().toString();
    }
}

看到這種使用棧的方式也很好:
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章