394-文字列復号

3289 ワード

394-文字列復号


符号化された文字列を指定し、復号された文字列を返します.
符号化規則は、k[encoded_string]であり、カッコ内のencoded_を表すstringはちょうどk回繰り返します.注意kは正の整数であることを保証する.
入力文字列は常に有効であると考えられます.入力文字列には余分なスペースがなく、入力した四角カッコは常にフォーマットの要件を満たしています.
また、元のデータには数字は含まれておらず、すべての数字は重複回数kのみを表し、例えば3 aや2[4]のような入力は現れないと考えられます.
例:
s = "3[a]2[bc]",   "aaabcbc".
s = "3[a2[c]]",   "accaccacc".
s = "2[abc]3[cd]ef",   "abcabccdcdcdef".

ソース:力ボタン(LeetCode)リンク:https://leetcode-cn.com/problems/decode-string著作権はインターネットの所有に帰属する.商業転載は公式の授権に連絡してください.非商業転載は出典を明記してください.
    public String decodeString(String s) {
        char[] chs = s.toCharArray();

        Stack strs = new Stack<>();
        Stack nums = new Stack<>();
        StringBuilder tmp = new StringBuilder();

        StringBuilder res = new StringBuilder();
        for (int i = 0; i < chs.length; i++) {
            char c = chs[i];
            if (Character.isDigit(c)) {
                int k = c - '0';
                i++;
                while (Character.isDigit(chs[i])) {
                    k = k * 10 + chs[i++] - '0';
                }
                nums.push(k);
                if(tmp.length() != 0) {
                    strs.push(tmp.toString());
                    tmp = new StringBuilder();
                }
            } else if (c == ']') {
                String ss = "";
                if(nums.size() == strs.size()) {
                    ss = strs.pop();
                }

                int k = nums.pop();
                StringBuilder t = new StringBuilder();
                while (k > 0) {
                    t.append(ss).append(tmp);
                    k--;
                }
                tmp = t;
            } else if (c != '['){
                tmp.append(c);
            }

            if(nums.isEmpty()) {
                res.append(tmp);
                tmp = new StringBuilder();
            }
        }
        return res.toString();
    }
    public String decodeString(String s) {
        char[] chs = s.toCharArray();

        Stack strs = new Stack<>();
        Stack nums = new Stack<>();
        StringBuilder tmp = new StringBuilder();
        int k = 0;
        for (int i = 0; i < chs.length; i++) {
            char c = chs[i];
            if (Character.isDigit(c)) {
                while (Character.isDigit(chs[i])) {
                    k = k * 10 + chs[i++] - '0';
                }
                i--;
            } else if (c == ']') {
                String ss = strs.pop();
                int pop = nums.pop();
                StringBuilder t = new StringBuilder(ss);
                while (pop > 0) {
                    t.append(tmp);
                    pop--;
                }
                tmp = t;
            } else if (c != '['){
                tmp.append(c);
            } else {
                nums.push(k);
                strs.push(tmp.toString());
                tmp = new StringBuilder();
                k = 0;
            }
        }
        return tmp.toString();
    }