2021-04-23 19:01:54 +08:00
|
|
|
|
//给定一个经过编码的字符串,返回它解码后的字符串。
|
|
|
|
|
//
|
|
|
|
|
// 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
|
|
|
|
|
//
|
|
|
|
|
// 你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
|
|
|
|
|
//
|
|
|
|
|
// 此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// 示例 1:
|
|
|
|
|
//
|
|
|
|
|
// 输入:s = "3[a]2[bc]"
|
|
|
|
|
//输出:"aaabcbc"
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// 示例 2:
|
|
|
|
|
//
|
|
|
|
|
// 输入:s = "3[a2[c]]"
|
|
|
|
|
//输出:"accaccacc"
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// 示例 3:
|
|
|
|
|
//
|
|
|
|
|
// 输入:s = "2[abc]3[cd]ef"
|
|
|
|
|
//输出:"abcabccdcdcdef"
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// 示例 4:
|
|
|
|
|
//
|
|
|
|
|
// 输入:s = "abc3[cd]xyz"
|
|
|
|
|
//输出:"abccdcdcdxyz"
|
|
|
|
|
//
|
|
|
|
|
// Related Topics 栈 深度优先搜索
|
|
|
|
|
// 👍 741 👎 0
|
|
|
|
|
|
|
|
|
|
package leetcode.editor.cn;
|
|
|
|
|
|
|
|
|
|
import java.util.Stack;
|
|
|
|
|
|
|
|
|
|
//394:字符串解码
|
|
|
|
|
public class DecodeString {
|
|
|
|
|
public static void main(String[] args) {
|
|
|
|
|
//测试代码
|
|
|
|
|
Solution solution = new DecodeString().new Solution();
|
|
|
|
|
//accaccacc
|
|
|
|
|
System.out.println(solution.decodeString("3[a2[c]]"));
|
|
|
|
|
//aaabcbc
|
|
|
|
|
System.out.println(solution.decodeString("3[a]2[bc]"));
|
2021-04-23 19:46:17 +08:00
|
|
|
|
//abcabccdcdcdef
|
|
|
|
|
System.out.println(solution.decodeString("2[abc]3[cd]ef"));
|
|
|
|
|
//abccdcdcdxyz
|
|
|
|
|
System.out.println(solution.decodeString("abc3[cd]xyz"));
|
2021-04-23 19:01:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//力扣代码
|
|
|
|
|
//leetcode submit region begin(Prohibit modification and deletion)
|
|
|
|
|
class Solution {
|
|
|
|
|
public String decodeString(String s) {
|
|
|
|
|
Stack<String> stack = new Stack<>();
|
|
|
|
|
StringBuilder str = new StringBuilder();
|
2021-04-23 19:46:17 +08:00
|
|
|
|
if (s.length() == 0) {
|
|
|
|
|
return "";
|
2021-04-23 19:01:54 +08:00
|
|
|
|
}
|
2021-04-23 19:46:17 +08:00
|
|
|
|
for (int i = 0; i < s.length(); i++) {
|
|
|
|
|
if (stack.isEmpty() && s.charAt(i) >= 'a' && s.charAt(i) <= 'z') {
|
|
|
|
|
str.append(s.charAt(i));
|
|
|
|
|
} else if (s.charAt(i) == ']') {
|
|
|
|
|
StringBuilder temp = new StringBuilder();
|
|
|
|
|
while (!"[".equals(stack.peek())) {
|
|
|
|
|
temp.insert(0, stack.pop());
|
|
|
|
|
}
|
|
|
|
|
stack.pop();
|
|
|
|
|
String numString = "";
|
|
|
|
|
while (!stack.isEmpty() && Character.isDigit(stack.peek().charAt(0))) {
|
|
|
|
|
numString = stack.pop() + numString;
|
|
|
|
|
}
|
|
|
|
|
int num = Integer.parseInt(numString);
|
|
|
|
|
String shortStr = "";
|
|
|
|
|
for (int j = 0; j < num; j++) {
|
|
|
|
|
shortStr = temp + shortStr;
|
|
|
|
|
}
|
|
|
|
|
if (stack.isEmpty()) {
|
|
|
|
|
str.append(shortStr);
|
|
|
|
|
} else {
|
|
|
|
|
stack.push(shortStr);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
stack.push(s.substring(i, i + 1));
|
|
|
|
|
}
|
2021-04-23 19:01:54 +08:00
|
|
|
|
}
|
|
|
|
|
return str.toString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//leetcode submit region end(Prohibit modification and deletion)
|
|
|
|
|
|
|
|
|
|
}
|