【刷题1】LeetCode 394. 字符串解码 java题解

我的代码能力:-∞
在这里插入图片描述

1.题目

https://leetcode-cn.com/problems/decode-string/
在这里插入图片描述

2.分析

设置两个变量res,mutil。
遍历String中的每个字符c:
如果c是字符,加入res的尾部;
如果c是数字,将数字字符转化为数字multi;
如果c是‘[’,将当前multi和res入栈,再将multi和res清零;
如果c是’]’,出栈,res=last_res+cur_multi*res。其中,
last_res是上个 [ 到当前 [ 的字符串,例如 “3[a2[c]]” 中的 a;
cur_multi是当前 [ 到 ] 内字符串的重复倍数,例如 “3[a2[c]]” 中的 2

3.复杂度

时间复杂度 O(N),一次遍历 s;
空间复杂度 O(N),辅助栈在极端情况下需要线性空间,例如 2[2[2[a]]]。

4.代码

class Solution {
    public String decodeString(String s) {
        LinkedList<Integer> stk_multi=new LinkedList<>();
        LinkedList<String> stk_res=new LinkedList<>();
        StringBuilder res=new StringBuilder();
        int multi=0;
        for(Character c:s.toCharArray()){
            if(c=='['){
                stk_multi.addLast(multi);
                stk_res.addLast(res.toString());
                multi=0;
                res=new StringBuilder();
            }
            else if(c==']'){
                //
                int cur=stk_multi.removeLast();
                StringBuilder tmp=new StringBuilder();
                for(int i=0;i<cur;i++){
                    tmp.append(res);
                }
                res=new StringBuilder(stk_res.removeLast()+tmp);
            }
            else if(c>='0'&&c<='9'){
                multi=multi*10+(c-'0');//字符串可能超过10
            }
            else{
                res.append(c);
            }
        }
        return res.toString();
    }
}

// 2021.12.13 八百年没写代码的我复习第一天

class Solution {
    public String decodeString(String s) {
        LinkedList<Integer> s_mul=new LinkedList<>();
        LinkedList<String> s_res=new LinkedList<>();
        int mul=0;
        StringBuilder res=new StringBuilder();
        for(char c:s.toCharArray()){
            //数字
            if(Character.isDigit(c)){
                mul=mul*10+(c-'0');
            }
            //左括号
            else if(c=='['){
                s_mul.push(mul);
                s_res.push(res.toString());
                mul=0;
                res=new StringBuilder();
            }
            //右括号
            else if(c==']'){
                int cur=s_mul.pop();
                StringBuilder tmp=new StringBuilder();
                for(int i=0;i<cur;i++){
                    tmp.append(res);
                }
                res=new StringBuilder(s_res.pop());
                res.append(tmp);
            }
            //字母
            else{
                res.append(c);
            }
        }
        return res.toString();
    }
}

5.结果

`在在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值