LeetCode394字符串解码

实现步骤:

//上面碰到[,把num=2和res=ak入栈,入栈后清空num和res

//上面碰到],开始真正拼接字符串,拼接res=bc,拼接num栈顶的次数也就是2,然后把ak拼接到两个bc的前面去,然后组成需要重复的字符串,然后num和str栈出栈

//又碰到],num出栈,需要akbcbc重复13次

代码:

public String decodeString(String s) {

        int num = 0;

        StringBuilder res = new StringBuilder();//存储最终结果



        ArrayDeque<Integer> numStack = new ArrayDeque<>();//用来存重复的次数

        ArrayDeque<String> strStack = new ArrayDeque<>();//存要重复的字符串。[后面的字符串需要压栈



        for (char c : s.toCharArray()) {

            if (c >= '0' && c <= '9') {

                num = num * 10 + (c - '0');//数字可能有多位,如上面例子中最前面的13

            } else if (c == '[') {//碰见[,把num放到num栈里,把res放到str栈里;并清空res和num

                numStack.push(num);

                strStack.push(res.toString());//start,end

                res.delete(0, res.length());//字符串清空

                num = 0;//清0

            } else if (c == ']') {//对res进行拼接

                String item = res.toString();//item为需要重复的项

                // bug 修复:numStack.pop() 不应该放在 for 循环的比较地方,这样的话,会将所有的栈顶元素弹出

                int itemCnt = numStack.pop();

                for (int i = 1; i < itemCnt; i++) {//从1开始,因为有一个已经存在

                    res.append(item);

                }

                res.insert(0, strStack.pop());//上面图中ak要放到bcbc的前面去,生成下一次要重复的项akbcbc

            } else {

                res.append(c);//没碰到],之前用来累加存储

            }

        }



        return res.toString();

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值