题目描述

image.png

解题思路

辅助栈

使用2个栈,一个记录当前字符串出现的次数,也就是 [ 前的数字。一个记录当前字符串,还没遇到 ] 表示没有追加k的时候,遇到 ] 后按照 [ 前的数字进行追加,在入栈。
image.png
参照动图🔗

  1. public String decodeString(String s) {
  2. int multi = 0; // 表示括号中字符串出现次数
  3. StringBuilder res = new StringBuilder(); // 字符串结果
  4. Stack<String> stack_res = new Stack<>();
  5. Stack<Integer> stack_multi = new Stack<>();
  6. for (char c : s.toCharArray()) {
  7. if (c == '[') {
  8. // 将次数入栈
  9. stack_multi.push(multi);
  10. // 重新赋值为0,防止后面的数字使用
  11. multi = 0;
  12. // res操作同理
  13. stack_res.push(res.toString());
  14. res = new StringBuilder();
  15. } else if (c == ']') {
  16. StringBuilder temp = new StringBuilder();
  17. Integer n = stack_multi.pop();
  18. for (int i = 0; i < n; i++) temp.append(res);
  19. res = new StringBuilder(stack_res.pop() + temp);
  20. }
  21. // 注意数字范围是1<=n<=300,所以multi需要乘10后再相加
  22. else if ('0' <= c && c <= '9') multi = multi * 10 + Integer.parseInt(c + "");
  23. else res.append(c);
  24. }
  25. return res.toString();
  26. }

递归法

递归法算法思路和迭代法一致,递归从 [ 开始,从 ] 结束。
用一个队列来记录遍历的到达字符串s的什么地方,很方便的获取字符。而不用单独操作索引。

  1. // 递归法
  2. public String decodeString(String s) {
  3. Queue<Character> queue = new LinkedList<>();
  4. for (char c : s.toCharArray()) {
  5. queue.offer(c);
  6. }
  7. return dfs(queue);
  8. }
  9. public String dfs(Queue<Character> queue) {
  10. StringBuilder res = new StringBuilder();
  11. int multi = 0;
  12. while (!queue.isEmpty()) {
  13. char c = queue.poll();
  14. if (c == '[') {
  15. String tmp = dfs(queue);
  16. while (multi > 0) {
  17. res.append(tmp);
  18. multi--;
  19. }
  20. } else if (c == ']') {
  21. return res.toString();
  22. } else if ('0' <= c && c <= '9') multi = multi * 10 + Integer.parseInt(c + "");
  23. else res.append(c);
  24. }
  25. return res.toString();
  26. }
  27. }