394. 字符串解码【中等】

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

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

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

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

测试用例保证输出的长度不会超过 105

示例 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"

一、栈

思路:

定义两个栈,把数字和字符压入不同的栈,通过判断 来入栈出栈。注意,StringBuilder 在栈中也可以添加元素,栈中存的是引用地址。数字栈并不连续,每次只存这次的数字。但字符栈是连续的,每次都保留上次的字符,并拼接上这次的字符,字符栈中压入的是上一次遇到 ] 的字符,然后这次的字符放在currentString ,在用字符栈中弹出的字符 append 上 n * currentString 。

时间复杂度O(n)

代码:

java 复制代码
class Solution {
    public String decodeString(String s) {
        Stack<Integer> countStack = new Stack<>();
        Stack<StringBuilder> stringStack = new Stack<>();
        StringBuilder currentString = new StringBuilder();
        int countSum = 0;

        // 数字栈并不连续,每次只存这次的数字。
        // 但字符栈是连续的,每次都保留上次的字符,并拼接上这次的字符,字符栈中压入的是上一次遇到 ] 的字符,然后这次的字符放在currentString ,在用字符栈中弹出上次的字符 append 上 n * currentString 。
        for(char c : s.toCharArray()){
            if(Character.isDigit(c)){
                countSum = countSum * 10 + (c - '0');
            }else if(c == '['){
                countStack.push(countSum);
                stringStack.push(currentString);

                countSum = 0;
                currentString = new StringBuilder();
            }else if(c == ']'){
                int repeatNum = countStack.pop();
                StringBuilder decdoeString = stringStack.pop();

                for(int i = 0; i < repeatNum; i++){
                    decdoeString.append(currentString);
                }
                currentString = decdoeString;
            }else{
                currentString.append(c);
            }
        }
        return currentString.toString();
    }
}
相关推荐
karry_k3 小时前
MyBatis批量insert-select踩坑:useGeneratedKeys=true 可能让PostgreSQL返回大量插入结果
java·后端
karry_k3 小时前
PostgreSQL 在 MyBatis 中执行正常 SQL 失效:一次 DELETE USING 踩坑记录
java·后端
vibecoding日记5 小时前
双非如何快速入职字节等大厂大模型?真实案例分析:推理优化和投机解码
算法·求职·大模型工程师
yszaygr21387 小时前
Verilog参数化游程编码RLE模块
算法
SamDeepThinking7 小时前
从源码到代码:MyBatis-Flex 与 MyBatis-Plus 的逐项对比
java·后端·程序员
望易7 小时前
刚设计的大模型架构-双域耦合认知框架
算法·架构
她的男孩10 小时前
Spring Boot 接 Flowable 工作流:用 3 个注解搭一个请假审批流程
java·后端·架构
复杂网络11 小时前
多个 Claude Code 与多个 Codex 协同工作:设计与实现方案
算法
荣码11 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python