394. 字符串解码
解题思路
- 构造辅助栈stack 遍历字符串s的每一个字符c
- 当c为数字的时候 将数字转化为数字multi
- 当c是字母的时候直接在builder尾部添加c
- 当c是[ 将Multi 入stack1 builder转换为字符串 入stack2 然后全部初始化
- 将[之前的临时结果builder 入栈stack2 用来发现对应]之后的拼接操作
- 记录此前的Multi 发现]之后 获取multi * 字符串
- 当c是]之后 取出stack2栈顶元素 根据multi 计算重复字符串 最后再次取出栈顶元素字符串 拼接
class Solution {
public String decodeString(String s) {
// 使用栈结构
// 字节后端面试题目
StringBuilder builder = new StringBuilder();
int multi = 0;
// 创建两个栈
Stack<Integer> stack1 = new Stack<>();
Stack<String> stack2 = new Stack<>();
// 遍历字符串
for(Character c:s.toCharArray()){
if(c == '['){
// 将前面的字符入栈
// 数字字符进入stack1
stack1.push(multi);
// 字符串进入stack2
stack2.push(builder.toString());// StringBuilder 转换为字符串
// 之后清空multi 以及builder
multi = 0;
builder = new StringBuilder();
}
else if(c == ']'){
StringBuilder tmp = new StringBuilder();
int temp = stack1.peek();// 取出栈顶元素 也就是最后一个进入栈的元素 也就是栈顶元素
stack1.pop();
// 将res 全部添加到tmp
for(int i = 0; i < temp; i++){
tmp.append(builder);// 拼接这些字符串
}
// 同时将stack2的栈顶元素 拼接tmp
builder = new StringBuilder(stack2.peek() + tmp);
stack2.pop();
}else if(c >= '0' && c <= '9'){
multi = multi * 10 + Integer.parseInt(c + "");
}else{
builder.append(c);
}
}
// res.append(c);
return builder.toString();
}
}
版权声明:本文为qq_44653420原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。