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();
    }
}
相关推荐
季明洵6 分钟前
C语言实现单链表
c语言·开发语言·数据结构·算法·链表
shandianchengzi11 分钟前
【小白向】错位排列|图文解释公考常见题目错位排列的递推式Dn=(n-1)(Dn-2+Dn-1)推导方式
笔记·算法·公考·递推·排列·考公
I_LPL11 分钟前
day26 代码随想录算法训练营 回溯专题5
算法·回溯·hot100·求职面试·n皇后·解数独
Yeats_Liao13 分钟前
评估体系构建:基于自动化指标与人工打分的双重验证
运维·人工智能·深度学习·算法·机器学习·自动化
怒放吧德德14 分钟前
后端 Mock 实战:Spring Boot 3 实现入站 & 出站接口模拟
java·后端·设计
only-qi15 分钟前
leetcode19. 删除链表的倒数第N个节点
数据结构·链表
cpp_250116 分钟前
P9586 「MXOI Round 2」游戏
数据结构·c++·算法·题解·洛谷
浅念-21 分钟前
C语言编译与链接全流程:从源码到可执行程序的幕后之旅
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
biyezuopinvip26 分钟前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
脸大是真的好~29 分钟前
EasyExcel的使用
java·excel