LeetCode 热题 100_字符串解码(71_394_中等_C++)(栈)
LeetCode 热题 100_字符串解码(71_394)
- 题目描述:
- 输入输出样例:
- 题解:
- 解题思路:
- 思路一(栈):
- 代码实现
- 代码实现(栈):
- 以思路一为例进行调试
题目描述:
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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]
题解:
解题思路:
思路一(栈):
1、通过中括号内嵌中括号的情况,且内嵌的中括号首先计算,可以想到栈的方法解决此问题。
字符串中有四种字符:
① 数字:将数字转换为整数(数字的位数可为多位),称为字符串的重复次数
② 字母:将连续的字母提取出来,连接成字符串
③ 左括号:重复次数和字符串 分别入 数字栈和字符串栈
④ 右括号:弹出状态(出栈),重复n次对应字符串,并连接字符串
例子:s = “3[a2[c]]”
初始状态:k=0 (数字), current=“” (部分字符串), counts栈为空,strings栈为空
① 3 为数字字符,计算连续的数字字符并转换为整数,k=3;
② [ 为左括号,将k=3 和 current=““分别压入 counts栈={3}和strings={””}栈,重置k=0,current=“”
③ a 为字母,计算连接的字母,current=“a”;
④ 2 k=2;
⑤ [ 将k=2 和 current=“a” 分别压入 counts栈={3,2}和strings栈={“”,“a”},重置k=0,current=“”
⑥ c current=“c”;
⑦ ] 遇到右括号,将counts栈={3,2}中的2出栈,此时current=“c"重复2次 -> current=“cc”,strings栈={”“,“a”}中的"a"出栈,与current连接"acc”
⑧ ] 遇到右括号,counts栈={3}中的3出栈,此时current=“acc"重复3次->current = “accaccacc”,strings栈={”“}中的”“出栈,与current连接"accaccacc”
2、复杂度分析:
① 时间复杂度: O(S),S代表解码后得出的字符串长度,我们在遍历原字符串的同时会也会将解码后的字符串压入栈中,且进行字符串的连接。
② 空间复杂度:O(S),S代表解码后得出的字符串长度,栈的总大小最终与 S 相同。
代码实现
代码实现(栈):
class Solution {
public:string decodeString(string s) {stack<int> counts; // 用来存储数字 (重复次数),栈用来存储每个 "[" 对应的重复次数stack<string> strings; // 用来存储之前的部分字符串,栈用来存储每个 "[" 之前的字符串string current = ""; // 用来存储当前正在构建的字符串(用于存放当前解析出来的子字符串)int k = 0; // 用来存储当前的重复次数// 遍历字符串中的每个字符for (char c : s) {if (isdigit(c)) {// 如果是数字,构建重复次数 k,直到遇到非数字字符k = k * 10 + (c - '0'); // 处理可能多位的数字} else if (c == '[') {// 如果遇到 '[',说明要开始一个新的子字符串块counts.push(k); // 将当前的重复次数推入栈中strings.push(current); // 将当前构建的字符串推入栈中current = ""; // 清空当前字符串,准备构建新的子字符串k = 0; // 重置重复次数为 0,开始处理新的重复数字} else if (c == ']') {// 如果遇到 ']',说明当前子字符串块的解析结束string temp = current; // 将当前的字符串保存到 temp 中current = strings.top(); // 从栈中获取之前的字符串部分strings.pop(); // 弹出栈中的字符串部分int repeatCount = counts.top(); // 从栈中获取重复次数counts.pop(); // 弹出栈中的重复次数// 将当前子字符串重复 repeatCount 次,并拼接到之前的部分for (int i = 0; i < repeatCount; i++) {current += temp; // 重复并拼接}} else {// 普通字符,直接加入当前正在构建的字符串current += c;}}return current; // 返回解码后的最终字符串}
};
以思路一为例进行调试
#include<iostream>
#include<stack>
using namespace std;class Solution {
public:string decodeString(string s) {stack<int> counts; // 用来存储数字 (重复次数),栈用来存储每个 "[" 对应的重复次数stack<string> strings; // 用来存储之前的部分字符串,栈用来存储每个 "[" 之前的字符串string current = ""; // 用来存储当前正在构建的字符串(用于存放当前解析出来的子字符串)int k = 0; // 用来存储当前的重复次数// 遍历字符串中的每个字符for (char c : s) {if (isdigit(c)) {// 如果是数字,构建重复次数 k,直到遇到非数字字符k = k * 10 + (c - '0'); // 处理可能多位的数字} else if (c == '[') {// 如果遇到 '[',说明要开始一个新的子字符串块counts.push(k); // 将当前的重复次数推入栈中strings.push(current); // 将当前构建的字符串推入栈中current = ""; // 清空当前字符串,准备构建新的子字符串k = 0; // 重置重复次数为 0,开始处理新的重复数字} else if (c == ']') {// 如果遇到 ']',说明当前子字符串块的解析结束string temp = current; // 将当前的字符串保存到 temp 中current = strings.top(); // 从栈中获取之前的字符串部分strings.pop(); // 弹出栈中的字符串部分int repeatCount = counts.top(); // 从栈中获取重复次数counts.pop(); // 弹出栈中的重复次数// 将当前子字符串重复 repeatCount 次,并拼接到之前的部分for (int i = 0; i < repeatCount; i++) {current += temp; // 重复并拼接}} else {// 普通字符,直接加入当前正在构建的字符串current += c;}}return current; // 返回解码后的最终字符串}
};int main(int argc, char const *argv[])
{string str="3[a2[c]]";Solution s;string ans=s.decodeString(str);cout<<ans;return 0;
}
LeetCode 热题 100_字符串解码(71_394)原题链接
欢迎大家和我沟通交流(✿◠‿◠)
相关文章:
LeetCode 热题 100_字符串解码(71_394_中等_C++)(栈)
LeetCode 热题 100_字符串解码(71_394) 题目描述:输入输出样例:题解:解题思路:思路一(栈): 代码实现代码实现(栈):以思路一为例进行调…...

「DataX」数据迁移-IDEA运行DataX方法总结
背景 业务需求希望把Oracle数据库中的数据,迁移至MySql数据库中,因为需要迁移全量和增量的数据,所以希望想用数据迁移工具进行操作。 经过一些调研查询,最终打算使用DataX进行数据的迁移。 DataX简单介绍 DataX 是阿里云 DataW…...

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 过滤器:实现请求的预处理与后处理
<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、过滤器&…...
DeepSeek与浏览器自动化AI Agent构建指南
文章使用到的模型可以用硅基流动中的: 注册链接:硅基流动统一登录 邀请码:FytHp9Xa 一、技术选型阶段 1. 基础组件选择 AI模型:DeepSeek-R1开放API(对话/推理)或DeepSeek-Coder(代码生成&#…...
面试中常问的mysql数据库指令【杭州多测师_王sir】
数据库中的修改表结构、增删改查、用户权限操作DDL 》数据库定义语言 create database,create table drop tableDML 》数据库操作语言 insert into,delete from,update set,DQL 》数据库查询语言 select .... from....crea…...
深度学习驱动的智能化革命:从技术突破到行业实践
第一章 深度学习的技术演进与核心架构 1.1 从浅层网络到深度学习的范式转变 深度学习的核心在于通过多层次非线性变换自动提取数据特征,其发展历程可划分为三个阶段:符号主义时代的规则驱动(1950s-1980s)、连接主义时代的浅层网络(1990s-2000s)以及深度学习时代的端到端…...

基于编译器特性浅析C++程序性能优化
最近在恶补计算机基础知识,学到CSAPP第五章的内容,在这里总结并且展开一下C程序性能优化相关的内容。 衡量程序性能的方式 一般而言,程序的性能可以用CPE(Cycles Per Element)来衡量,其指的是处理每个元素…...

服务器上通过ollama部署deepseek
2025年1月下旬,DeepSeek的R1模型发布后的一周内就火了,性能比肩OpenAI的o1模型,且训练成本仅为560万美元,成本远低于openAI,使得英伟达股票大跌。 下面我们来看下如何个人如何部署deepseek-r1模型。 我是用的仙宫云的…...
Android Coil总结
文章目录 Android Coil总结概述添加依赖用法基本用法占位图变形自定义ImageLoader取消加载协程支持缓存清除缓存监听 简单封装 Android Coil总结 概述 Coil 是一个用于 Android 的 Kotlin 图像加载库,旨在简化图像加载和显示的过程。它基于 Kotlin 协程࿰…...

《安富莱嵌入式周报》第351期:DIY半导体制造,工业设备抗干扰提升方法,NASA软件开发规范,小型LCD在线UI编辑器,开源USB PD电源,开源锂电池管理
周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV16C95YEEZs 《安富莱嵌入式周报》第351期:DIY半导体…...
Redis在人员管理系统中的应用示例
用户会话管理 场景:用户登录后存储会话信息,支持多服务器共享 实现: 用户登录成功后,生成唯一Token(如JWT),作为Redis的Key Value存储用户ID、角色、权限等信息,设置过期时间&…...
The Wedding Juicer POJ - 2227
采取从外层边界,一步一步向内部拓展的策略,具体来说,一开始将最外面一层的点加入队列,并标记这些点的坐标已经被访问 取出队列中高度最低的点,将其弹出,查看其上下左右的点,如果新点没有被访问…...

# 深入理解RNN(一):循环神经网络的核心计算机制
深入理解RNN:循环神经网络的核心计算机制 RNN示意图 引言 在自然语言处理、时间序列预测、语音识别等涉及序列数据的领域,循环神经网络(RNN)一直扮演着核心角色。尽管近年来Transformer等架构逐渐成为主流,RNN的基本原理和思想依然对于理…...

分布式锁—6.Redisson的同步器组件
大纲 1.Redisson的分布式锁简单总结 2.Redisson的Semaphore简介 3.Redisson的Semaphore源码剖析 4.Redisson的CountDownLatch简介 5.Redisson的CountDownLatch源码剖析 1.Redisson的分布式锁简单总结 (1)可重入锁RedissonLock (2)公平锁RedissonFairLock (3)联锁MultiL…...
同步 Fork 仓库的命令
同步 Fork 仓库的命令 要将您 fork 的仓库的 main 分支与原始仓库(fork 源)同步,您可以使用以下命令: 首先,确保您已经添加了原始仓库作为远程仓库(如果尚未添加): git remote add…...

基于PySide6的CATIA零件自动化着色工具开发实践
引言 在汽车及航空制造领域,CATIA作为核心的CAD设计软件,其二次开发能力对提升设计效率具有重要意义。本文介绍一种基于Python的CATIA零件着色工具开发方案,通过PySide6实现GUI交互,结合COM接口操作实现零件着色自动化。该方案成…...
OpenManus 的提示词
OpenManus 的提示词 引言英文提示词的详细内容工具集的详细说明中文翻译的详细内容GitHub 仓库信息背景分析总结 引言 OpenManus 是一个全能 AI 助手,旨在通过多种工具高效地完成用户提出的各种任务,包括编程、信息检索、文件处理和网页浏览等。其系统提…...

Ubuntu-docker安装mysql
只记录执行步骤。 1 手动下载myql镜像(拉去华为云镜像) docker pull swr.cn-east-3.myhuaweicloud.com/library/mysql:latest配置并启动mysql 在opt下创建文件夹 命令:cd /opt/ 命令:mkdir mysql_docker 命令:cd m…...

Electron桌面应用开发:自定义菜单
完成初始应用的创建Electron桌面应用开发:创建应用,随后我们就可以自定义软件的菜单了。菜单可以帮助用户快速找到和执行命令,而不需要记住复杂的快捷键,通过将相关功能组织在一起,用户可以更容易地发现和使用应用程序…...

理解 JavaScript 中的浅拷贝与深拷贝
在 JavaScript 开发中,我们经常需要复制对象或数组。然而,复制的方式不同,可能会导致不同的结果。本文将详细介绍 浅拷贝 和 深拷贝 的概念、区别以及实现方式,帮助你更好地理解和使用它们。 1. 什么是浅拷贝? 定义 …...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...