题目: 给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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"来源:力扣(LeetCode) 链接:link
代码:JAVA
import java.util.*; public class 字符串解码394 { public static void main(String[] args) { // TODO 自动生成的方法存根 String s = "3[a2[c]]"; System.out.println(decodeString(s)); } public static String decodeString(String s) { StringBuilder res = new StringBuilder(); int multi = 0; LinkedList<Integer> stack_multi = new LinkedList<>(); LinkedList<String> stack_res = new LinkedList<>(); for(Character c : s.toCharArray()) { if(c == '[') { stack_multi.addLast(multi); stack_res.addLast(res.toString()); multi = 0; res = new StringBuilder(); } else if (c == ']'){ StringBuilder tmp = new StringBuilder(); int cur_multi = stack_multi.removeLast(); for(int i = 0; i < cur_multi; i++) { tmp.append(res); } res = new StringBuilder(stack_res.removeLast() + tmp); } else if(c >= '0' && c <= '9') multi = multi * 10 + Integer.parseInt(c+""); else res.append(c); } return res.toString(); } }解题思路
以每一个 [] 为整体 创建两个栈:一个暂存之前还没用到的数字(倍数),另一个存贮之前还没用到的字符串 只考虑当前 [] 内的数字或字母,如果遇到了下一个 [] 的 ' [ ' 就要把这个之前的数字和字母都暂存到栈中,并且把 multi 和 res 都初始化 当遇到 ' ] ' 时,就要先乘 之前存入数据栈的最后一个数,然后和字符栈的最后一个拼接