zoukankan      html  css  js  c++  java
  • [LeetCode]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".

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/decode-string

    题解

    • 用栈。
    • 注意数字可能不是一位的处理。
    • 代码写的可能有点啰嗦。可以先弹出再判断,而不是先peek。StringBuilder的操作要再了解一波。

    代码

    class Solution {
        public String decodeString(String s) {
            if(s==null){
                return null;
            }
            Stack<Character> stack=new Stack<>();
            for(int i=0;i<s.length();++i){
                if(s.charAt(i)!=']'){
                    stack.push(s.charAt(i));
                }
                else{
                    StringBuilder tempS=new StringBuilder("");
                    while(stack.peek()!='['){
                        tempS.append(stack.pop());
                    }
                    String tempStr=tempS.reverse().toString();
                    stack.pop();
                    
                    int num=0;
                    int pos=1;//
                    while(!stack.isEmpty()&&stack.peek()>='0'&&stack.peek()<='9'){//
                        num+=(stack.pop()-'0')*pos;//
                        pos*=10;
                    }
                    while(num--!=0){
                        for(int j=0;j<tempStr.length();++j){
                            stack.push(tempStr.charAt(j));
                        }
                    }
                }
            }
            StringBuilder decodedStr=new StringBuilder("");
            while(!stack.isEmpty()){
                decodedStr.append(stack.pop());
            }
            return decodedStr.reverse().toString();
        }
    }
    
  • 相关阅读:
    BZOJ3672/UOJ7 [Noi2014]购票
    POJ3718 Facer's Chocolate Dream
    BZOJ1453:[WC]Dface双面棋盘
    BZOJ2957:楼房重建
    AtCoder Grand Contest 009 D:Uninity
    BZOJ2877:[NOI2012]魔幻棋盘
    BZOJ3065:带插入区间K小值
    BZOJ3489:A simple rmq problem
    浅谈主席树
    AtCoder Regular Contest 080 E:Young Maids
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/11306359.html
Copyright © 2011-2022 走看看