• 力扣 394. 字符串解码


    题目

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

    编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

    你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

    此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

    示例

    输入:s = “3[a]2[bc]”
    输出:“aaabcbc”

    输入:s = “3[a2[c]]”
    输出:“accaccacc”

    输入:s = “2[abc]3[cd]ef”
    输出:“abcabccdcdcdef”

    输入:s = “abc3[cd]xyz”
    输出:“abccdcdcdxyz”

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/decode-string
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    方法1:辅助栈

    ⭐题解:https://leetcode.cn/problems/decode-string/solution/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/
    需要从内向外生成与拼接字符串,这与栈的先入后出特性对应。

    stack_multi:存 " [ " 外的倍数multi 。
    stack_res:存 " [ " 外的拼接字符 。
    res:每次遇见 " [ " 时重置,保证每次都是一段连续的字符串序列,从内向外。

    具体操作

    • 当遍历到 " [ " 时
      • 将当前 " [ " 外的乘数和拼接字符分别入栈。
      • 清空 multi 和 res。
    • 当遍历到 " ] " 时
      • 将当前乘数出队,对 res 的字符串(此时 res 是一个 " [] " 内的字符串)进行多次拼接操作。
      • 将对应的拼接字符出队,进行拼接。
    • 当遍历到 数字 时
      • 更新乘数。
    • 当遍历到 字母 时
      • 更新res内容。

    更多内容在:【倦倦喵.cn】~

    Java实现
    class Solution {
        public String decodeString(String s) {
            Stack<Integer> stack_multi = new Stack<>();
            Stack<String> stack_res = new Stack<>();
            int multi = 0;
            StringBuffer res = new StringBuffer();
    
            for (char c : s.toCharArray()) {
                if (c == '[') {
                    stack_multi.push(multi);
                    stack_res.push(res.toString());
                    multi = 0;
                    res = new StringBuffer();
                } else if (c == ']') {
                    int cur_multi = stack_multi.pop();
                    StringBuffer tmp = new StringBuffer();
                    for (int i = 0; i < cur_multi; i++) {
                        tmp.append(res);
                    }
                    res = new StringBuffer();
                    res.append(stack_res.pop()).append(tmp);
                } else if (Character.isDigit(c)) {
                    multi = multi * 10 + (c - '0');
                } else {
                    res.append(c);
                }
            }
    
            return res.toString();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

  • 相关阅读:
    用java实现PDF的下载
    2021年上半年软件设计师下午真题及答案解析(三)
    [附源码]计算机毕业设计JAVAjsp校园自行车租售管理系统
    [游戏开发][Unity]读取Assetbundle报错Decompressing this format (49)
    数据分析入门
    postman请求400错误-日期LocalData
    LeetCode每日一题(212. Word Search II)
    Protocol - Exploits学习笔记
    Linux常用命令大全(非常全!!!)
    二分查找详解(while条件判断+转换值判断)
  • 原文地址:https://blog.csdn.net/qq_42467009/article/details/128194477