力扣hot100:394. 字符串解码(递归/括号匹配,字符串之间相对顺序)
LeetCode:394. 字符串解码
本题容易想到用递归处理,在写递归时主要是需要明确自己的递归函数的定义。
不过我们也可以利用括号匹配的方式使用栈进行处理。
1、递归
- 定义递归函数
string GetString(string & s,int & i);
- 表示处理处理整个
number[letter]
,处理后i
指向’]'之后的一个元素 - 当
letter
中有这样的结构时,直接递归处理。
- 表示处理处理整个
- 定义函数
int GetNum(string & s,int & i);
- 在遇到数字时调用,表示获取s中前缀的数
- 在遇到数字时调用,表示获取s中前缀的数
class Solution {
public:string decodeString(string s) {string target;int len = s.size();for(int i = 0; i < len;){if(s[i] <= 'z' && s[i] >= 'a'){target += s[i ++];}else{target += GetString(s, i);}}return target;}
private:string GetString(string & s,int & i){//处理number[letter],处理后i指向']'之后的一个元素int num = GetNum(s, i);//获取重复次数++ i;//忽略掉'['string str;//获取字符串的前面字符位 3[aa2[cd]ff]while(s[i] != ']'){if(s[i] <= 'z' && s[i] >= 'a'){str += s[i ++];}else{str += GetString(s, i);}}++ i;//忽略掉']'//重复子串string substr = str;while(--num){str += substr;}return str;}
private:int GetNum(string & s,int & i){int num = 0;while(s[i] >= '0' && s[i] <= '9'){num *= 10;num += s[i ++] -'0';}return num;}
};
2、栈操作
这里可以用不定长数组来模拟栈操作,方便从栈底向栈顶遍历。
我们可以使用类似括号匹配的方法,从左到右遍历字符串,将字符串压入栈中,遇到右括号']'
则说明,一定会有一个左括号[
匹配,我们可以将这之间的内容弹栈并形成一个整体,再从栈顶中拿出数字联合成一个串,压入栈中,以此类推,直到所有的左右括号匹配完,然后再链接所有串。
- 时间复杂度: O ( S + ∣ s ∣ ) O(S + |s|) O(S+∣s∣),
s
是最终字符串长度,|s|
是原字符串的长度。- 需要遍历原字符串一次,并且每一个字符需要入栈一次,每个字符要出栈一次,字符串需要进行连接,最终连接的长度取决于最终字符串长度。
- 空间复杂度: O ( S ) O(S) O(S)
class Solution {
public:string decodeString(string s) {vector<string> sta;for(auto i : s){if(i ==']'){string str;vector<string> temp;//获取[]中的字符串while(sta.back() != "["){temp.push_back(sta.back());sta.pop_back();}for(int j = temp.size() - 1; j >= 0; -- j)str += temp[j];//reverse(str.begin(), str.end());//翻转成正序sta.pop_back();//弹出'['string digitStr;//获取数字串while(sta.size() > 0 && sta.back() >="0" && sta.back() <= "9"){digitStr += sta.back();sta.pop_back();}int num = 0;//获取数字for(int j = digitStr.size() - 1; j >=0; -- j){num *= 10;num += digitStr[j] - '0';}//将number[letter]结合成一个串string substr = str;while(--num) str += substr;sta.emplace_back(str);}else sta.emplace_back(string() + i);}string ans;for(auto & i : sta)ans += i;return ans;}
};
- 注意这两者的区别:
for(int j = temp.size() - 1; j >= 0; -- j) str += temp[j];
reverse(str.begin(), str.end());//翻转成正序
- 前者并不改变栈中字符串内部顺序,而是改变栈中字符串之间的相对顺序
- 后者会改变栈中字符串的内部顺序
相关文章:

力扣hot100:394. 字符串解码(递归/括号匹配,字符串之间相对顺序)
LeetCode:394. 字符串解码 本题容易想到用递归处理,在写递归时主要是需要明确自己的递归函数的定义。 不过我们也可以利用括号匹配的方式使用栈进行处理。 1、递归 定义递归函数string GetString(string & s,int & i); 表示处理处理整个numbe…...

【C++11】多线程常用知识
知识体系 thread C++ thread中最常用的两个函数是join和detach,怎么选择呢,简单来说,如果希望等待线程结束,用join,如果希望异步执行,且不等待执行结果,那么就用detach;thread_local可以简单理解为一个线程级别的全局变量;线程id在调试多线程程序时是非常有用的东西;…...

详解linux设备下的/dev/null
/dev/zero是一个特殊的设备文件,它在Linux系统中通常被用来生成无限数量的零数据流。 这个设备文件位于/dev目录下,它不代表任何实际的硬件设备,而是一个虚拟设备。 当从/dev/zero设备中读取数据时,会得到无限数量的零字节&…...

GPT-4 Turbo 和 GPT-4 的区别
引言 人工智能(AI)领域的发展日新月异,OpenAI 的 GPT 系列模型一直是这一领域的佼佼者。GPT-4 和 GPT-4 Turbo 是目前市场上最先进的语言模型之一。本文将详细探讨 GPT-4 和 GPT-4 Turbo 之间的区别,以帮助用户更好地理解和选择适…...

基于小波多分辨分析的一维时间序列信号趋势检测与去除(MATLAB R2018a)
小波最开始是数学上提出的概念,并且在纯数学的王国里存在了一个世纪之久。最开始是为了弥补傅里叶分析的缺陷,即傅里叶级数发散的问题,并寻找出能够代替傅里叶分析的方法。从最早的一些艰难的探索开始直到慢慢发展成为一套完整系统的小波分析…...
Linux RedHat7.6操作系统的xfs格式化后,mount不生效
Linux RedHat7.6操作系统的xfs格式化后,mount不生效 问题现象 最近在准备测试环境的过程中,当对xfs文件系统格式化后,mount磁盘,通过df -h命令查看,未显示挂载磁盘信息 [rootZHZXLxjspo0db003 ~]# mount /dev/datavg/datavg-lv_data /data…...

高并发ping多台主机IP
简介 社区或者是大型公司往往有成千上万或者几百台设备,保持设备始终在线对网络运维人员来说至关重要,然而一个一个登录检查,或者一个一个ping并不明智,累人且效率极低,并出错率高。花钱买检测服务当我没说。 shell编…...
03 Linux 内核数据结构
Linux kernel 有四种重要的数据结构:链表、队列、映射、二叉树。普通驱动开发者只需要掌握链表和队列即可。 链表和队列 Linux 内核都有完整的实现,我们不需要深究其实现原理,只需要会使用 API 接口即可。 1、链表 链表是 Linux 内核中最简单、最普通的数据结构。链表是一…...

关于软件调用独显配置指引【笔记】
关于笔记本电脑不支持独显直连的,bios下也是没有切换独显直连的选项的,处理方法 简单的来说按照图片指引可配置让软件调用独显: 1、进入系统→屏幕→显示卡界面; 2、【添加应用】浏览需要调用独显的软件安装目录,并打开…...

正大国际期货:什么是主力合约?
一个期货品种,在同一时间段,会上市多个月份的合约, 由于主力合约交易量大,流动性高,一般建议新手交易主力合约。 主力合约通常指交易集中,流动性好的合约 ,即在一段时间内交易量和持仓量最大的…...

codeforces round 949 div2
A Turtle and Piggy Are Playing a Game 题目: 思路:输出2的幂次b使得2^b为最大的不超过x的数 代码: #include <iostream>using namespace std;const int N 2e5 10;void solve() {int l, r;cin >> l >> r;if(r % 2) …...

分享美好,高清无阻 - 直播极简联网解决方案
1、需求背景 随着移动互联网、UGC模式和直播平台的发展,网络直播的门槛日益降低,越来越多的人希望成为直播的主角。基于物联网的户外直播无线联网解决方案应运而生,满足直播者的需求。 户外直播无线联网解决方案提供了无处不在的直播体验&a…...

贪心算法-加油站
一、题目描述 二、解题思路 1.运动过程分析 这里需要一个油箱剩余油量的变量resGas,初始化resGas0;还需要一个标记从什么位置当做初始位置的startIdx,初始化startIdx0。 我们从数组下标idx0处开始向后遍历,初始时startIdx0&#…...
【ArcGIS微课1000例】0116:将度-分-秒值转换为十进制度值(字段计算器VBA)
相关阅读:【ArcGIS微课1000例】0087:经纬度格式转换(度分秒转度、度转度分秒) 文章目录 一、计算方法二、计算案例一、计算方法 将度分秒转换为十进制度的简单等式: DD = (Seconds/3600) + (Minutes/60) + Degrees如果角度值是负数,则转换方法不同。其中一种方法是: …...

【中国开源生态再添一员】天工AI开源自家的Skywork
刚刚看到《AI高考作文出圈,网友票选天工AI居首》,没想到在Huggingface中发现了Skywork大模型。天工大模型由昆仑万维自研,是国内首个对标ChatGPT的双千亿级大语言模型,天工大模型通过自然语言与用户进行问答式交互,AI生…...

【机器学习300问】109、什么是岭回归模型?
在进行回归任务时间,可以能会遇到特征数量多于观测数量或某些特征变量之间相关性较高(几乎线性相关)时,标准的线性回归模型的系数估计可能非常不精确,可以理解成独立方程个数小于未知数个数此时方程有无穷多解。 例如&…...

FJSP:烟花算法(FWA)求解柔性作业车间调度问题(FJSP),提供MATLAB代码
一、烟花算法介绍 参考文献: Tan, Y. and Y. Zhu. Fireworks Algorithm for Optimization. in Advances in Swarm Intelligence. 2010. Berlin, Heidelberg: Springer Berlin Heidelberg. 二、烟花算法求解FJSP 2.1FJSP模型介绍 柔性作业车间调度问题(Flexible …...

C++11 列表初始化(initializer_list),pair
1. {} 初始化 C98 中,允许使用 {} 对数组进行初始化。 int arr[3] { 0, 1, 2 };C11 扩大了 {} 初始化 的使用范围,使其可用于所有内置类型和自定义类型。 struct Date {int _year;int _month;int _day;Date(int year, int month, int day):_year(year…...
Python3 笔记:字符串的 startswith() 和 endswith()
1、startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。如果参数 beg 和 end 指定了值,则在指定范围内检查。 语法:str.startswith(substr, beg0,endlen(string)) 参数: s…...

Web前端安全问题分类综合以及XSS、CSRF、SQL注入、DoS/DDoS攻击、会话劫持、点击劫持等详解,增强生产安全意识
前端安全问题是指发生在浏览器、单页面应用、Web页面等前端环境中的各类安全隐患。Web前端作为与用户直接交互的界面,其安全性问题直接关系到用户体验和数据安全。近年来,随着前端技术的快速发展,Web前端安全问题也日益凸显。因此,…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...