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;
    }
};
相关文章
|
10天前
|
存储 人工智能 运维
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
106 47
【01】做一个精美的打飞机小游戏,浅尝阿里云通义灵码python小游戏开发AI编程-之飞机大战小游戏上手实践-优雅草央千澈-用ai开发小游戏尝试-分享源代码和游戏包
|
7天前
|
人工智能 Python
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
【02】做一个精美的打飞机小游戏,python开发小游戏-鹰击长空—优雅草央千澈-持续更新-分享源代码和游戏包供游玩-记录完整开发过程-用做好的素材来完善鹰击长空1.0.1版本
|
4月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
110 4
|
4月前
|
移动开发 Python Windows
python编程获取网页标题title的几种方法及效果对比(源代码)
python编程获取网页标题title的几种方法及效果对比(源代码)
|
2月前
|
测试技术 开发者 Python
使用Python解析和分析源代码
本文介绍了如何使用Python的`ast`模块解析和分析Python源代码,包括安装准备、解析源代码、分析抽象语法树(AST)等步骤,展示了通过自定义`NodeVisitor`类遍历AST并提取信息的方法,为代码质量提升和自动化工具开发提供基础。
105 8
|
3月前
|
安全 Linux 数据安全/隐私保护
python知识点100篇系列(15)-加密python源代码为pyd文件
【10月更文挑战第5天】为了保护Python源码不被查看,可将其编译成二进制文件(Windows下为.pyd,Linux下为.so)。以Python3.8为例,通过Cython工具,先写好Python代码并加入`# cython: language_level=3`指令,安装easycython库后,使用`easycython *.py`命令编译源文件,最终生成.pyd文件供直接导入使用。
120 3
python知识点100篇系列(15)-加密python源代码为pyd文件
|
4月前
|
人工智能 算法 图形学
总有一个是你想要的分享40个Python游戏源代码
这是一系列基于Python开发的游戏项目集合,包括中国象棋、麻将、足球、坦克大战、扑克等多种类型游戏,运用了Pygame等库实现图形界面与AI算法。此外还包含迷宫、数独、推箱子等益智游戏及经典游戏如《仙剑奇侠传二战棋版》和《星露谷物语》的Python版本,适合编程学习与娱乐。
293 11
|
3月前
|
缓存 网络协议 API
C/C++ StringToAddress(字符串转 boost::asio::ip::address)
通过上述步骤和示例代码,你可以轻松地在C++项目中实现从字符串到 `boost::asio::ip::address`的转换,从而充分利用Boost.Asio库进行网络编程。
119 0
|
3月前
|
编译器 C语言 C++
C/C++数字与字符串互相转换
C/C++数字与字符串互相转换
|
4月前
|
C++
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具