【LeetCode】Day140-字符串解码

题目

394. 字符串解码【中等】

题解

如果没有括号嵌套的情况发生,那这道题是很简单的,大不了一个个判断就行了,麻烦的就是这个括号嵌套,比如2[a2[bc]]

这道题可以用栈解决,如果当前字符为

  • 数字:解析出数字(字符转数字),并进栈
  • 字母或者左括号:进栈
  • 右括号:开始出栈->左括号出栈->出栈序列反转拼接成字符串->取栈顶数字(即之前字符串出现的次数)->组成新的字符串

这里可以利用不定长数组来模拟栈

class Solution {
    int i=0;
    public String decodeString(String s) {
        int n=s.length();
        StringBuffer res=new StringBuffer();//结果字符串
        LinkedList<String>stack=new LinkedList<>();
        while(i<n){
            char ch=s.charAt(i);
            //字母,入栈
            if(Character.isLetter(ch)||ch=='['){
                stack.addLast(String.valueOf(ch));
                i++;
            }
            //数字,入栈
            else if(Character.isDigit(ch)){
                stack.addLast(getDigit(s));
            }
            //右括号
            else{
                i++;
                LinkedList<String>letters=new LinkedList<String>();//存字母串
                while(!"[".equals(stack.peekLast()))
                    letters.addLast(stack.removeLast());
                Collections.reverse(letters);//出栈序列反转
                //左括号出栈
                stack.removeLast();
                //根据次数和字符串生成新的字符串
                int mul=Integer.parseInt(stack.removeLast());
                String str=getString(letters);//字符数组->字符串
                StringBuffer sub=new StringBuffer();
                for(int j=0;j<mul;j++)
                    sub.append(str);
                stack.addLast(sub.toString());//新字符串入栈
            }
        }
        return getString(stack);
    }
    //从字符串s中获取数字
    public String getDigit(String s){
        StringBuffer digit=new StringBuffer();
        while(Character.isDigit(s.charAt(i)))
            digit.append(s.charAt(i++));
        return digit.toString();
    }
    //数组拼接得到字符串
    public String getString(LinkedList<String>letters){
        StringBuffer sb=new StringBuffer();
        for(String letter:letters)
            sb.append(letter);
        return sb.toString();
    }
}

时间复杂度: O ( S + n ) O(S+n) O(S+n),记解码后得出的字符串长度为S,原字符串s的长度为n,遍历一遍s时间复杂度为O(n),解码后字符入栈拼接进答案时间复杂度为O(S)。

空间复杂度: O ( S ) O(S) O(S),栈的空间。

p.s 这道题真的有点麻烦,辅助空间很多,要写的简洁还挺难的,各种api都得掌握的非常好才能解的很顺利[叹气]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值