题目链接
字符串解码
题目描述
注意点
- s 由小写英文字母、数字和方括号 ‘[]’ 组成
- 1 <= s.length <= 30
- s 保证是一个 有效 的输入
- s 中所有整数的取值范围为 [1, 300]
解答思路
- 利用栈先进后出的特点,将字符存储进栈中
- 创建两个栈,一个数字栈,一个字符栈,当访问到数字时存储进数字栈中(注意整数取值范围为1~300),当访问到字母或’[‘时存储到字符栈中,当访问到’]‘时从数字栈中取出一个数字,再从字符栈中取出需要翻倍的字符(即遍历到’[‘为止),注意这些已经翻倍的字符可能也在另一个外层的’[]'中,后续可能再次翻倍,所以需要存储起来
代码
class Solution {
public String decodeString(String s) {
StringBuilder res = new StringBuilder();
Deque<Character> charDeque = new LinkedList<>();
Deque<Integer> digitDeque = new LinkedList<>();
for (int i = 0; i < s.length(); i++) {
// 数字
if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
int times = s.charAt(i) - '0';
while (i + 1 < s.length() && s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '9') {
times = times * 10 + (s.charAt(i + 1) - '0');
i++;
}
digitDeque.addLast(times);
continue;
}
if ((s.charAt(i) >= 'a' && s.charAt(i) <= 'z') || s.charAt(i) == '[') {
charDeque.addLast(c);
}
if (c == ']') {
int times = digitDeque.removeLast();
List<Character> list = new ArrayList<>();
while (!charDeque.isEmpty() && charDeque.getLast() != '[') {
list.add(charDeque.removeLast());
}
charDeque.removeLast();
for (int j = 0; j < times; j++) {
for (int k = list.size() - 1; k >= 0; k--) {
charDeque.addLast(list.get(k));
}
}
}
}
while (!charDeque.isEmpty()) {
res.append(charDeque.removeLast());
}
return res.reverse().toString();
}
}
关键点
- 注意元素插入栈和出栈的顺序