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();
    }
}
相关推荐
GreenTea几秒前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
风流 少年1 分钟前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅9 分钟前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
小席是个热心肠1 小时前
AI相关的自我学习
java·人工智能·学习
fqq31 小时前
力扣刷题前置Java语法
算法·leetcode·职场和发展
数智化管理手记3 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
半夏微凉半夏殇3 小时前
x11与weston对比,优先选哪个
leetcode·均值算法·eclipse
2501_906565123 小时前
数学之美探究
算法
oier_Asad.Chen3 小时前
【洛谷题解/AcWing题解/OI学习笔记】洛谷P2868【USACO07DEC】Sightseeing Cows G(01分数规划求最大比率)
算法·图论·spfa·二分·负环
cfm_29144 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型