1. 程式人生 > 其它 >LeetCode-394. 字串解碼

LeetCode-394. 字串解碼

題目來源

394. 字串解碼

題目詳情

給定一個經過編碼的字串,返回它解碼後的字串。

編碼規則為: k[encoded_string],表示其中方括號內部的 encoded_string 正好重複 k 次。注意 k 保證為正整數。

你可以認為輸入字串總是有效的;輸入字串中沒有額外的空格,且輸入的方括號總是符合格式要求的。

此外,你可以認為原始資料不包含數字,所有的數字只表示重複的次數 k ,例如不會出現像3a2[4]的輸入。

示例 1:

輸入: s = "3[a]2[bc]"
輸出: "aaabcbc"

示例 2:

輸入: s = "3[a2[c]]"
輸出: "accaccacc"

示例 3:

輸入: s = "2[abc]3[cd]ef"
輸出: "abcabccdcdcdef"

示例 4:

輸入: s = "abc3[cd]xyz"
輸出: "abccdcdcdxyz"

題解分析

解法一:棧

class Solution {
    public String decodeString(String s) {
        int n = s.length();
        LinkedList<String> sta  = new LinkedList<>();
        int pos = 0;
        while(pos < n){
            char ch = s.charAt(pos);
            if(Character.isDigit(ch)){// 數字直接進棧
                StringBuilder sb = new StringBuilder();
                while(pos < n && Character.isDigit(s.charAt(pos))){
                    sb.append(s.charAt(pos++));
                }
                sta.addLast(sb.toString());
            }else if(Character.isLetter(ch) || ch == '['){// 字母和左括號也進棧
                sta.addLast(String.valueOf(ch));
                pos++;
            }else{// 遇到右括號則出棧直到左括號
                pos++;
                LinkedList<String> list = new LinkedList<>();
                while(!sta.isEmpty() && !sta.peekLast().equals("[")){
                    list.addLast(sta.pollLast());
                }
                sta.pollLast();
                Collections.reverse(list);

                int times = Integer.parseInt(sta.pollLast());
                
                String temp = getStrings(list);
                StringBuilder sb = new StringBuilder();
                for(int i=0; i<times; i++){
                    sb.append(temp);
                }
                sta.addLast(sb.toString());
            }
        } 
        return getStrings(sta);
    }
    
    private String getStrings(List<String> list){
        StringBuilder sb = new StringBuilder();
        for(String str : list){
            sb.append(str);
        }
        return sb.toString();
    }
}
Either Excellent or Rusty