目录
- 1- 思路
- 栈实现+四种情况处理
- 2- 实现
- ⭐394. 字符串解码——题解思路
- 3- ACM 实现
- 原题链接:394. 字符串解码
1- 思路
栈实现+四种情况处理
- ① 遇到数字,进行倍数相加 、②遇到左括号,压栈之前的元素、③遇到右括号弹出,栈进行拼接、④否则遇到字母,直接拼接在 res
- 通过栈,实现先进后出的思想
对于输入 3[a2[c]]
的输入,在读到 3[
得到第一个括号 [
之后才会进行入栈操作,也就是将之前的 3 入栈到一个 multi
的栈中
-
- 定义一个
multi
变量用于存储倍数,也就是当前字符串扩大的倍数。
- 定义一个
-
- 定义
res
变量用于存储临时结果,如果读到的是字符,一直更新 res
- 定义
读取过程
- 读取数字:一开始如果读取的都是数字
multi
,则对multi*10 + c - '0';
的方式 - 读取字符:如果读取字符,暂存到
res
中,是否压栈取决于遇到的括号 - 遇到
'['
括号:如果遇到了左括号,则将'['
前状态的 数字multi
和字符res
进行压栈,之后重新更新multi
和res
- 遇到
']'
括号:如果遇到了右括号,则需要弹栈,进行处理
2- 实现
⭐394. 字符串解码——题解思路
class Solution {
public String decodeString(String s) {
StringBuilder res = new StringBuilder();
int multi = 0;
// 两个栈
Deque<Integer> stack_multi = new ArrayDeque<>();
Deque<String> stack_str = new ArrayDeque<>();
for(Character c: s.toCharArray()){
// 0-9
if( c>='0' && c<='9'){
multi = multi*10 + c-'0';
}else if(c == '['){
stack_multi.push(multi);
stack_str.push(res.toString());
multi = 0;
res = new StringBuilder();
}else if(c == ']'){
StringBuilder tmp = new StringBuilder();
int curMulti = stack_multi.pop();
for(int i = 0 ; i < curMulti;i++){
tmp.append(res);
}
res = new StringBuilder(stack_str.pop()).append(tmp);
}else{
res.append(c);
}
}
return res.toString();
}
}
3- ACM 实现
public class strDecode {
public static String strDecode(String str){
// 1. 数据结构
int multi = 0;
StringBuffer res = new StringBuffer();
// 数字倍数
Deque<Integer> stack_multi = new ArrayDeque<>();
Deque<String> stack_res = new ArrayDeque<>();
// 遍历字符串 str
for(Character c : str.toCharArray()){
// 如果是数字 更新倍数
if( c>='0' && c<= '9'){
multi = multi *10 + c - '0';
}else if( c == '['){
// 压栈
stack_multi.push(multi);
stack_res.push(res.toString());
// 重置
multi = 0;
res = new StringBuffer();
}else if(c==']'){
// 出栈计算
int nowMulti = stack_multi.pop();
StringBuffer tmp = new StringBuffer();
for(int i = 0 ; i < nowMulti;i++){
tmp = tmp.append(res);
}
res = new StringBuffer(stack_res.pop()).append(tmp);
}else{
res.append(c);
}
}
return res.toString();
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
System.out.println("结果是"+strDecode(input));
}
}