美文网首页
394. 字符串解码

394. 字符串解码

作者: 放下梧菲 | 来源:发表于2020-05-28 10:39 被阅读0次

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

    编码规则为: 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
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:394. 字符串解码

          本文链接:https://www.haomeiwen.com/subject/twsoahtx.html