力扣hot100:394. 字符串解码(递归/括号匹配,字符串之间相对顺序)

本文主要是介绍力扣hot100:394. 字符串解码(递归/括号匹配,字符串之间相对顺序),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LeetCode:394. 字符串解码
在这里插入图片描述
本题容易想到用递归处理,在写递归时主要是需要明确自己的递归函数的定义。
不过我们也可以利用括号匹配的方式使用栈进行处理。

1、递归

  • 定义递归函数string GetString(string & s,int & i);
    • 表示处理处理整个number[letter],处理后i指向’]'之后的一个元素
    • letter中有这样的结构时,直接递归处理。
  • 定义函数int GetNum(string & s,int & i);
    • 在遇到数字时调用,表示获取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. 字符串解码(递归/括号匹配,字符串之间相对顺序)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1045750

相关文章

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri