分类信息建站系统,陕西四通建设工程有限责任公司网站,成都旅游景点攻略自由行攻略,网站管理系统题目
给定一个经过编码的字符串#xff0c;返回它解码后的字符串。
编码规则为: k[encoded_string]#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的#xff1b;输入字符串中没有额外的空格#x…题目
给定一个经过编码的字符串返回它解码后的字符串。
编码规则为: 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 30s 由小写英文字母、数字和方括号 [] 组成s 保证是一个 有效 的输入。s 中所有整数的取值范围为 [1, 300] 解答
源代码
class Solution {public String decodeString(String s) {LinkedListCharacter stack new LinkedList();for (char ch : s.toCharArray()) {if (ch ! ]) {stack.offerLast(ch);} else {StringBuilder sb new StringBuilder();// 1. 将[之前的字符都出栈while (stack.peekLast() ! [) {sb.insert(0, stack.pollLast());}String str sb.toString();// 将[出栈stack.pollLast();// 2. 将数字字符出栈sb new StringBuilder();while (!stack.isEmpty() Character.isDigit(stack.peekLast())) {sb.insert(0, stack.pollLast());}int num Integer.parseInt(sb.toString());// 3. 进行解码 sb new StringBuilder();while (num 0) {sb.append(str);num--;}// 4. 将解码后的字符都放入栈中for (char c : sb.toString().toCharArray()) {stack.offerLast(c);}}}// 将栈中解码后的字符都拿出来StringBuilder code new StringBuilder();while (!stack.isEmpty()) {code.insert(0, stack.pollLast());}return code.toString();}
}
总结
这题思路倒是不难写只是每次遇到字符串的时候细节问题一大堆不停调试编译捂脸。
方括号会嵌套那么我们需要一个个进行解码。如 3[a2[c]] 我们需要先解码为 3[acc] 再解码为 accaccacc 。
遍历字符串把每个字符放入栈中直到遇到一个 ] 这就说明已经读完一个完整的方括号内容了那么此时进行出栈直到出栈到 [ 将这期间的字符保存起来。
这里要注意一下栈的特点是先进后出所以这里出栈时需要用到 StringBuilder.insert()函数把每个字符插入到首部。
字符保存完之后把 [ 出栈接下来一定是这个方括号对应的数字然后将数字对应的字符出栈保存起来。
根据这个方括号内的字符和对应的数字得到一个新的字符串将这个字符串的字符都压入栈中。
遍历完整个字符串栈中的字符就是我们所要求的将字符一个个出栈转换为字符串后返回。