【leetcode】394. 字符串解码

一、题目

二、思路

/**
 * 双栈:一个存储当前层的字符串结果,一个存储当前层前面的次数
 * 当遇到数字时,记录当前数字(注意数字不只是个位数,也可能是两位数),
 * 遇到[时,把当前数字和当前字符串都放入栈,
 * 遇到字母时,把字母加入当前字符串,
 * 遇到]时,取出数字和字符串,用取出来的字符串循环追加当前层的临时字符串
 */

图解:

 1.初始状态

2.tempcount记录左括号前的数字

 

3.遇到左括号,ans和tempCount入栈

4.遇到字母a,ans追加

 

5.遇到数字,tempCount记录

6.遇到左括号,ans和tempCount入栈

 

7.遇到字母c,ans追加

 

8.遇到右括号,出栈,然后把出栈的sb循环append当前的ans

9.最后一个右括号,继续出栈,出栈的sb循环append当前的ans

 

三、代码

class Solution {
        private Stack<StringBuilder> res = new Stack<>();
        private Stack<Integer> counts = new Stack<>();

        public String decodeString(String s) {
            StringBuilder ans = new StringBuilder(); //记录临时字符串
            int tempCount = 0; //记录临时操作数
            for (char c : s.toCharArray()) {
                //当前字符c是数字
                if (Character.isDigit(c)) {
                    //可能不是个位数
                    tempCount = tempCount * 10 + (c - '0');
                } else if (c == '[') { //c为左括号时
                    res.push(ans);
                    counts.push(tempCount);
                    ans = new StringBuilder(); //进入下一层
                    tempCount = 0;
                } else if (Character.isLetter(c)) { //c为字母时
                    ans.append(c); //加入当前层的临时字符串
                } else if (c == ']') { //c为右括号时
                    StringBuilder sb = res.pop();
                    Integer i = counts.pop();
                    for (int j = 0; j < i; j++) {
                        sb.append(ans); //拿上一层的ans去循环append这一层的ans,循环次数是进入这层时push的count
                    }
                    ans = sb;
                }
            }
            return ans.toString();
        }
    }

 技巧:这里使用了StringBuild,这样可以随时为某层动态添加字符串。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值