字符串解码

字符串解码

在这里插入图片描述

我们来讲讲思路:一看到括号的匹配问题我们就要想到一个数据结构:栈,那么我们这个题的解决的基本方向就是利用栈先入后出的特点,那么:

1.我们先遍历字符串

2.开始循环如果当前字符为‘]’那么我们开始出栈

3.出栈条件为当前栈不为空并且不是‘[’的时候循环

4.当到‘[’时我们上边的循环组成一个字符串String str是一个原子符串的一部分

5.然后我们让‘[’弹栈

6.之后我们需要一个count的字符串来记录数字开启一个循环(因为数字又可能是几位),由于我们采用的是栈结构所以count=stack.pop()+count,把每次取出来的数放在前面;

7.然后我们把string解析为整形

8.而后开始i<count的循环,然后newStr+=str,将原来生成的字符串重复规定的次数

9.然后将newStr重新压入栈,开始下一轮循环

10.如果当前字符不为‘]’那么元素入栈

11.循环结束字符串生成完毕由于是栈所以当栈不为空时,resStr=stack.pop()+resStr

12.返回resStr

举个例子:当给出的字符串为3[a2[c]]时

1. 开始循环:3不为‘]’入栈 a 不为‘]’入栈

2.[不为‘]’入栈

3.2不为‘]’入栈

4.c不为‘]’入栈

5.‘]’为‘]’开始弹栈

5.1 c不为‘[’ str=c+str str=c

5.2 [ 为‘[’停止循环

6.[ 弹栈

7. 2为数字弹栈循环进行一次 count=2+count count=2

8.开始count循环newStr+=str str=cc

9.cc入栈 开启下一轮循环

10.]为’]’

11.开始循环cc不为‘[’

12.str=cc+str str=cc

13.a 不为‘[’ str=a+str str=acc

14.[弹栈

15.开始循环 3 为数字 count=3+count count=3

16.i<count 开始循环 newStr+=str newStr=accaccacc

17.accaccacc入栈循环结束

18.当栈不为空 resStr=stack.pop()+resStr resStr=accaccacc

19.返回accaccacc 结束

是不是很有逻辑性的一道题上代码


```class Solution {
    public String decodeString(String s) {
        Stack<String> stack=new Stack<>();
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)==']'){
                String str="";//用来记录单个不循环字字符串
                while(!stack.isEmpty()&&!stack.peek().equals("[")){
                    str=stack.pop()+str;
                }
                stack.pop();
                String count="";
                while(!stack.isEmpty()&&isDigit(stack.peek().charAt(0))){
                    count=stack.pop().charAt(0)-'0'+count;
                }
                String childStr="";
                int num=Integer.parseInt(count);
                for(int j=0;j<num;j++){
                    childStr+=str;
                }
                stack.push(childStr);
            }else{
                stack.push(s.charAt(i)+"");
            }
        }
        String resStr="";
        while(!stack.isEmpty()){
            resStr=stack.pop()+resStr;
        }
        return resStr;
    }
    public boolean isDigit(char c){
        return c>='0'&&c<='9';
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值