题目
-
概述:给定一个经过编码的字符串,返回它解码后的字符串,编码规则为:k[encoded_string],表示其中方括号内部的encoded_string正好重复k次,k为正整数
输入字符串总是有效的
如果没有括号就不会出现数字
括号里面内容不会包含数字
思路
-
由于字符串可以是有括号嵌套的,那么需要保存嵌套前的数据,所以考虑用栈实现
-
遍历字符串:
- 若一直出现数字,则将数字持续拼接直到字符串遍历结束或遇到非数字字符,将拼接后的数字字符串放入栈中
- 若出现'[',则将"["放入栈中
- 若出现除数字或括号外的字符,则将其持续拼接直到字符串遍历结束或遇到数字或']',将拼接后得到得字符串放入栈中
若出现']',则出栈3次,将第一次出栈的字符串重复k次并拼接起来再放入栈中,k为第三次出栈得到的数字字符串- 若出现']',则将出栈的字符串依次拼接,直至遇到"[",将"["出栈,再出栈一次得到编码次数k,将拼接的字符串重复k次后再拼接放入栈中
-
最后将栈中元素依次出栈并逆序拼接,得到解码后的字符串
代码
class Solution {
public String decodeString(String s) {
LinkedList<String> stack = new LinkedList<>();
StringBuilder digitTemp = new StringBuilder();
StringBuilder strTemp = new StringBuilder();
StringBuilder temp = new StringBuilder();
String encodeStr;
int encodeNumber;
for (char c : s.toCharArray()) {
switch (c) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
if (strTemp.length() > 0) {
stack.push(strTemp.toString());
strTemp = new StringBuilder();
}
digitTemp.append(c);
break;
case '[':
if (digitTemp.length() > 0) {
stack.push(digitTemp.toString());
digitTemp = new StringBuilder();
}
stack.push("[");
break;
case ']':
while (!"[".equals(stack.peek())) {
strTemp.insert(0, stack.pop());
}
stack.pop();
encodeStr = strTemp.toString();
strTemp = new StringBuilder();
encodeNumber = Integer.parseInt(stack.pop());
for (int i = 0; i < encodeNumber; ++i) {
temp.append(encodeStr);
}
stack.push(temp.toString());
temp = new StringBuilder();
break;
default:
strTemp.append(c);
break;
}
}
if (digitTemp.length() > 0) {
temp.append(digitTemp);
}
if (strTemp.length() > 0) {
temp.append(strTemp);
}
while (!stack.isEmpty()) {
temp.insert(0, stack.pop());
}
return temp.toString();
}
}
网友评论