字符串解码

题目链接

字符串解码

题目描述

字符串解码_第1张图片

注意点

  • s 由小写英文字母、数字和方括号 ‘[]’ 组成
  • 1 <= s.length <= 30
  • s 保证是一个 有效 的输入
  • s 中所有整数的取值范围为 [1, 300]

解答思路

  • 利用栈先进后出的特点,将字符存储进栈中
  • 创建两个栈,一个数字栈,一个字符栈,当访问到数字时存储进数字栈中(注意整数取值范围为1~300),当访问到字母或’[‘时存储到字符栈中,当访问到’]‘时从数字栈中取出一个数字,再从字符栈中取出需要翻倍的字符(即遍历到’[‘为止),注意这些已经翻倍的字符可能也在另一个外层的’[]'中,后续可能再次翻倍,所以需要存储起来

代码

class Solution {
    public String decodeString(String s) {
        StringBuilder res = new StringBuilder();
        Deque<Character> charDeque = new LinkedList<>();
        Deque<Integer> digitDeque = new LinkedList<>();
        for (int i = 0; i < s.length(); i++) {
            // 数字
            if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
                int times = s.charAt(i) - '0';
                while (i + 1 < s.length() && s.charAt(i + 1) >= '0' && s.charAt(i + 1) <= '9') {
                    times = times * 10 + (s.charAt(i + 1) - '0');
                    i++;
                }
                digitDeque.addLast(times);
                continue;
            }
            if ((s.charAt(i) >= 'a' && s.charAt(i) <= 'z') || s.charAt(i) == '[') {
                charDeque.addLast(c);
            }
            if (c == ']') {
                int times = digitDeque.removeLast();
                List<Character> list = new ArrayList<>();
                while (!charDeque.isEmpty() && charDeque.getLast() != '[') {
                    list.add(charDeque.removeLast());
                }
                charDeque.removeLast();
                for (int j = 0; j < times; j++) {
                    for (int k = list.size() - 1; k >= 0; k--) {
                        charDeque.addLast(list.get(k));
                    }
                }
            }
        }
        while (!charDeque.isEmpty()) {
            res.append(charDeque.removeLast());
        }
        return res.reverse().toString();
    }
}

关键点

  • 注意元素插入栈和出栈的顺序

你可能感兴趣的:(算法TOP100,数据结构,leetcode,算法,java,栈)