LeetCode 394. 字符串解码

https://leetcode-cn.com/problems/decode-string/

这个题做过很多次了,没啥难度,利用栈存储前面出现过的操作就可以了。

    /**
     * 执行用时 :
     * 1 ms
     * , 在所有 Java 提交中击败了
     * 90.09%
     * 的用户
     * 内存消耗 :
     * 37.8 MB
     * , 在所有 Java 提交中击败了
     * 7.69%
     * 的用户
     * @param s
     * @return
     */
    public String decodeString(String s) {
        LinkedList<String> stack = new LinkedList<>();
        int num = 0;
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            //遇到数字就将它累加起来,防止出现个位数以上的数字。同时将统计字符串的sb强制写入栈中刷新缓存。
            if(c >= '0'&& c <= '9'){
                if(sb.length() != 0){
                    stack.add(new String(sb));
                    sb = new StringBuilder();
                }
                num  = num * 10 + (c - '0');
                //遇到小写或者大写字母就直接统计
            }else if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')){
                sb.append(c);
                //遇到[,首先先判断是否有数字生成,如果有就强制将它写入栈中然后刷新。然后再把自己写入到栈中
            }else if(c == '['){
                if(num != 0){
                    stack.add(String.valueOf(num));
                    num = 0;
                }
                stack.add(String.valueOf(c));
            }else if (c == ']'){
                //头插法直到遇到[,表示这个阶段需要重复的字符串已经寻找完毕
                while(!"[".equals(stack.getLast())){
                    sb.insert(0,stack.removeLast());
                }
                String word = new String(sb);
                sb = new StringBuilder();
                //移除[
                stack.removeLast();
                //获得重复次数
                int times = Integer.parseInt(stack.removeLast());
                //将word重复times次
                stack.add(word.repeat(times));
            }
        }
        //使用头插法将栈中元素拿回出来,利用sb可以防止最后出现只重复一次的字符,例如示例3
        while(!stack.isEmpty()){
            sb.insert(0,stack.removeLast());
        }
        return sb.toString();
    }

 

posted @ 2020-05-28 10:16  ZJPang  阅读(187)  评论(0编辑  收藏  举报