题目描述
解题思路
辅助栈
使用2个栈,一个记录当前字符串出现的次数,也就是 [ 前的数字。一个记录当前字符串,还没遇到 ] 表示没有追加k的时候,遇到 ] 后按照 [ 前的数字进行追加,在入栈。
参照动图🔗
public String decodeString(String s) {int multi = 0; // 表示括号中字符串出现次数StringBuilder res = new StringBuilder(); // 字符串结果Stack<String> stack_res = new Stack<>();Stack<Integer> stack_multi = new Stack<>();for (char c : s.toCharArray()) {if (c == '[') {// 将次数入栈stack_multi.push(multi);// 重新赋值为0,防止后面的数字使用multi = 0;// res操作同理stack_res.push(res.toString());res = new StringBuilder();} else if (c == ']') {StringBuilder temp = new StringBuilder();Integer n = stack_multi.pop();for (int i = 0; i < n; i++) temp.append(res);res = new StringBuilder(stack_res.pop() + temp);}// 注意数字范围是1<=n<=300,所以multi需要乘10后再相加else if ('0' <= c && c <= '9') multi = multi * 10 + Integer.parseInt(c + "");else res.append(c);}return res.toString();}
递归法
递归法算法思路和迭代法一致,递归从 [ 开始,从 ] 结束。
用一个队列来记录遍历的到达字符串s的什么地方,很方便的获取字符。而不用单独操作索引。
// 递归法public String decodeString(String s) {Queue<Character> queue = new LinkedList<>();for (char c : s.toCharArray()) {queue.offer(c);}return dfs(queue);}public String dfs(Queue<Character> queue) {StringBuilder res = new StringBuilder();int multi = 0;while (!queue.isEmpty()) {char c = queue.poll();if (c == '[') {String tmp = dfs(queue);while (multi > 0) {res.append(tmp);multi--;}} else if (c == ']') {return res.toString();} else if ('0' <= c && c <= '9') multi = multi * 10 + Integer.parseInt(c + "");else res.append(c);}return res.toString();}}
