【LeetCode】394.字符串解码

题目

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: 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 <= 30
  • s 由小写英文字母、数字和方括号 '[]' 组成
  • s 保证是一个 有效 的输入。
  • s 中所有整数的取值范围为 [1, 300] 

解答

源代码

class Solution {
    public String decodeString(String s) {
        LinkedList 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()函数,把每个字符插入到首部。

字符保存完之后,把" [ "出栈,接下来一定是这个方括号对应的数字,然后将数字对应的字符出栈保存起来。

根据这个方括号内的字符和对应的数字得到一个新的字符串,将这个字符串的字符都压入栈中。

遍历完整个字符串,栈中的字符就是我们所要求的,将字符一个个出栈,转换为字符串后返回。

你可能感兴趣的:(LeetCode,leetcode,算法,java)