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();
    }
}
相关推荐
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题 第192题】【08_Kafka篇】第8题:死信队列是什么?延时队列是什么?
java·kafka·消息队列·死信队列·延时队列
meng半颗糖3 小时前
3.Java流程控制语句
java·开发语言·intellij-idea
大模型码小白3 小时前
企业级检索增强后端集成:Java 服务如何管理知识库版本
java·服务器·开发语言·人工智能·python·microsoft
用户6169182299933 小时前
记录一次死锁检测
java
jvmind_dev3 小时前
1c1g 容器莫名 OOM Killed?排查 Metaspace 持续增长与脚本引擎的坑
java·后端
geovindu3 小时前
go:Backtracking Algorithm
开发语言·后端·算法·golang·回溯算法
yuannl103 小时前
图的最短路径Dijkstra
数据结构
AI多Agent协作实战派3 小时前
AI多Agent协作系统实战(二十二):从6列到12列——任务监控报告的进化之路
java·人工智能·uni-app·bug
用户3126874877204 小时前
@Transactional 注了等于没用?Spring 事务失效的 7 种场景,你踩过几个
java
千桐科技4 小时前
DataX 执行引擎正式加入:qData 开源版 v1.6.0 新增 Quartz + DataX 轻量运行模式!
java·大数据·开源·数据治理·数据中台·qdata