Skip to content
On this page

394.字符串解码

题目

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[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) {
        char[] words = s.toCharArray();
        int len = words.length;
        int i = 0;
        String ans = "";
        while(i < len){
		    // 如果是字符
            if(Character.isLetter(words[i])){
                ans += words[i];
                // 如果是数字
            }else if(Character.isDigit(words[i])){
                // 数字可能是多位
                int num = Character.getNumericValue(words[i]);
                while(Character.isDigit(words[++i])) num = num * 10 + Character.getNumericValue(words[i]);
                int start = i + 1;
                Stack<Character> stack = new Stack<>();
                stack.push(words[i]);
                while(!stack.isEmpty() && i < len){
                    // ']'可能是最后一个字符
                    if(i == len - 1 || words[++i] == ']') stack.pop();
                    else if(words[i] == '[') stack.push('[');
                }
                // 递归获取括号中解析后的内容
                String substr = decodeString(s.substring(start, i));
                for(int j = 1; j <= num; j++){
                    ans += substr;
                }
            }
            i++;
        }
        return ans;
    }
}