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".

本题直观上是比较复杂的,括号还套括号,比较难以处理,因此我们先分析一下本题该如何做。我们当遇见括号的时候,肯定要把括号内的括号先给处理掉,否则你重复k次还重复的是有数字有括号的内容,因此我们要先处理括号内部的,是不是想到了栈,先处理后面再处理前面。
如果是使用栈的话,方法就是遍历字符串
1、遍历到数字,就继续往后遍历直到没有数字,然后把数字计算出来存入栈中。
2、遍历到字母或者[,直接压入栈中。
3、遍历到],开始出栈,注意要反着出,直到遇见[,为止,然后取出数字,将这些已经出的字母重复数字的次数,继续亚入栈中。
遍历完毕后,直接把栈中的所有字符串拼接,注意一定是反着拼接的,答案就是拼接完毕的字符串了。

思路很清晰,代码也不难写,关键是处理字符串的细节,字母字符的转化,数字字符串的转化,字符串转成数字,各种细节需要细心处理。

代码如下:

class Solution {
    public String decodeString(String s) {
        
        Stack<String> stack = new Stack<String>();
        int i = 0;
        while (i < s.length()){
            char ch = s.charAt(i);
            //当当前字母是数字直接处理所有数字
            if (Character.isDigit(ch)){
                int num = 0;
                while (Character.isDigit(ch)){
                    num = num * 10 + (ch - '0');
                    i++;
                    ch = s.charAt(i);
                }
                stack.push("" + num);
            }
            //当是字母或者是[直接入栈 
            else if (ch == '[' || Character.isLetter(ch)){
                stack.push("" + ch);
                i++;
            }
            //当时]开始出栈
            else {
                String res = "";
                String r = "";
                String temp = stack.pop();
                while ( !temp.equals("[")){
                    res = temp + res;
                    temp = stack.pop();
                }
                temp = stack.pop();
                int count = Integer.valueOf(temp);
                for (int c = 0; c < count; c++){
                    r += res;
                }
                stack.push(r);
                i++;
            }
        }
        String ans = "";
        while ( !stack.isEmpty() ){
            ans = stack.pop() + ans;
        }
        return ans;
    }
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容