字符串解码
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/3f5fa1c6b50bbd3ba4c959283445a320.png)
我们来讲讲思路:一看到括号的匹配问题我们就要想到一个数据结构:栈,那么我们这个题的解决的基本方向就是利用栈先入后出的特点,那么:
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';
}
}