给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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”
提示:
1 <= s.length <= 30
s 由小写英文字母、数字和方括号 ‘[]’ 组成
s 保证是一个 有效 的输入。
s 中所有整数的取值范围为 [1, 300]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/decode-string
(1)栈
思路参考本题官方题解。
//思路1————栈
public class Solution {
int index = 0;
public String decodeString(String s) {
//使用链表来模拟栈
LinkedList<String> stack = new LinkedList<String>();
index = 0;
while (index < s.length()) {
char cur = s.charAt(index);
if (Character.isDigit(cur)) {
//获取一个数字 k 并进栈(1 ≤ k ≤ 300)
String digits = getDigits(s);
stack.addLast(digits);
} else if (Character.isLetter(cur) || cur == '[') {
//获取一个字母并进栈
stack.addLast(String.valueOf(s.charAt(index++)));
} else {
index++;
LinkedList<String> sub = new LinkedList<>();
while (!"[".equals(stack.peekLast())) {
sub.addLast(stack.removeLast());
}
Collections.reverse(sub);
//左括号出栈
stack.removeLast();
//此时栈顶元素为当前 sub 对应的字符串应该出现的次数
int times = Integer.parseInt(stack.removeLast());
StringBuffer buffer = new StringBuffer();
String str = getString(sub);
//构造字符串
while (times > 0) {
buffer.append(str);
times--;
}
//将构造好的字符串加入到栈中
stack.addLast(buffer.toString());
}
}
return getString(stack);
}
public String getDigits(String s) {
StringBuffer buffer = new StringBuffer();
while (Character.isDigit(s.charAt(index))) {
buffer.append(s.charAt(index++));
}
return buffer.toString();
}
//拼接 stack 中的所有字符串并返回
public String getString(LinkedList<String> stack) {
StringBuffer buffer = new StringBuffer();
for (String s : stack) {
buffer.append(s);
}
return buffer.toString();
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_43004044/article/details/125030053
内容来源于网络,如有侵权,请联系作者删除!