LeetCode每日一题题解:394. 字符串解码-题解-python && C++源代码

简介: LeetCode每日一题题解:394. 字符串解码-题解-python && C++源代码

394. 字符串解码


难度中等1067收藏分享切换为英文接收动态反馈


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


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


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


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


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

提示:


1 <= s.length <= 30

s 由小写英文字母、数字和方括号 '[]' 组成

s 保证是一个 有效 的输入。

s 中所有整数的取值范围为 [1, 300]

题解:


一个思想就是在设置两个变量,在遇到【之前 res是空的 minit用来存储遇见【之前的数字,res是存储【】内部的字母,遇到】之后,则弹出stack 之前存储的,进行求解。


Python代码:

class Solution:
    def decodeString(self, s: str) -> str:
        stack , res , minit = [] , '' , 0  #构建原变量
        for i in s:
            if i == '[':  #如果遇到左括号则将值的res 和  minit压入栈备用
                stack.append([res , minit])
                res , minit = '' , 0  #压入栈之后清零 如果再遇到第二个【   则进行第二个
            elif i == ']':
                last_res , last_minit = stack.pop()    #遇到】  则弹出之前压入栈的 数字和 【】内的值 进行拼接
                res = last_res + res*last_minit
            elif '0'<=i<='9':        #存在大于10的值,则需要进行minit*10 + int(i)操作
                minit = minit*10 + int(i)
            else:
                res += i  #用来拼接某个【】中的内容
        return res

C++代码:

class Solution {
public:
    string decodeString(string s) {
        string res = "";
        stack<int> minit ;
        stack<string> strs ;
        int num = 0;
        int n = s.size();
        for (int i=0; i<n; i++){
            if (s[i] == '['){
                minit.push(num);
                strs.push(res);
                num = 0;
                res = "";
            }
            else if (s[i] == ']'){
                int tes = minit.top();
                minit.pop();
                for (int j=0; j<tes; j++)
                    strs.top() += res;
                res = strs.top();
                strs.pop();
            }
            else if (s[i] >= '0' && s[i] <= '9'){
                num = num*10 + s[i] - '0';
            }
            else{
                res = res + s[i];
            }
        }
        return res;
    }
};
相关文章
|
6月前
|
jenkins Shell 测试技术
|
存储 人工智能 运维
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
704 48
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
|
6月前
|
安全 jenkins Java
Java、Python、C++支持jenkins和SonarQube(一)
Jenkins 是一个开源的 持续集成(CI)和持续交付(CD) 工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
406 5
|
6月前
|
jenkins Java Shell
Java、Python、C++支持jenkins和SonarQube(全集)
Jenkins 是一个开源的持续集成(CI)和持续交付(CD)工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
564 1
|
6月前
|
jenkins Java 持续交付
Java、Python、C++支持Jenkins和SonarQube(三)
Python与Jenkins和SonarQube
276 1
|
人工智能 Python
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
688 7
|
6月前
|
jenkins Java 测试技术
|
移动开发 Python Windows
python编程获取网页标题title的几种方法及效果对比(源代码)
python编程获取网页标题title的几种方法及效果对比(源代码)
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
694 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
11月前
|
Go 索引
【LeetCode 热题100】394:字符串解码(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 394:字符串解码。题目要求对编码字符串如 `k[encoded_string]` 进行解码,其中 `encoded_string` 需重复 `k` 次。文章提供了两种解法:使用栈模拟和递归 DFS,并附有 Go 语言实现代码。栈解法通过数字栈与字符串栈记录状态,适合迭代;递归解法则利用函数调用处理嵌套结构,代码更简洁。两者时间复杂度均为 O(n),但递归需注意栈深度问题。文章还总结了解题注意事项及适用场景,帮助读者更好地掌握字符串嵌套解析技巧。
314 6

推荐镜像

更多