【经典面试】87 字符串解码

字符串解码

    • 题解1 递归(程序栈)——形式语言自动机(LL(1)) : O(S)
      • 另一种递归(直观)
    • 题解2 2个栈(逆波兰式)
      • 1个栈(参考官方,但是不喜欢)

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

编码规则为: 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 递归(程序栈)——形式语言自动机(LL(1)) : O(S)

class Solution {int idx;
public:int getdigits(string& s){int ret = 0;while(idx < s.size() && isdigit(s[idx])){ret = ret*10 + s[idx++]-'0';}return ret;} string getstring(string& s){// 结束条件if(idx == s.size() || s[idx] == ']')return string("");// 当前字符char cur = s[idx];// 重复次数置1int rep = 1;// 返回值string ret = "";// condition:如果是数字if(isdigit(cur)){int rep = getdigits(s);string str = "";// 跳左括号idx ++;// 顺序很重要:跳完左括号就要 取后面的stringstr = getstring(s);// 跳右括号idx ++;// 后--while(rep--){ret += str;}}// condition:如果是字母else if(isalpha(cur)){ret = string(1, s[idx++]);}return ret+getstring(s);}string decodeString(string s) {idx = 0;return getstring(s);}
};

在这里插入图片描述

另一种递归(直观)

class Solution {public:string decodeString(string s) {string res = "";for(int i = 0; i < s.size(); i++){// 字符if(s[i]>='a' && s[i] <= 'z'){res += s[i];// 左括号或者数字}else{int rep = 0;while(s[i] >= '0' && s[i] <= '9'){rep = rep*10 + s[i++]-'0';}int curp = i+1;int lnum = 1;while(lnum){i ++; // i最后是下一次解决的一段字符串的结尾([[[..]]],左括号要和右括号数对上)if(s[i] == '[') lnum++;if(s[i] == ']') lnum--;}string str = decodeString(s.substr(curp, i-curp));while(rep --){res += str;}}}return res;}
};

在这里插入图片描述

题解2 2个栈(逆波兰式)

class Solution {public:string decodeString(string s) {stack<int> num_stk; // 数字栈stack<string> str_stk; // 字符串栈string res = ""; // 当前累积的字符串// 逆波兰式for(int i = 0; i < s.size(); i++){if(isdigit(s[i])){int tmp = s[i]-'0';while(isdigit(s[++i]))tmp = tmp*10 + s[i]-'0';num_stk.push(tmp);i --; // for 有自增}else if(s[i] == '['){str_stk.push(res); // 把上一段存起来res = ""; // 清空,开始累积该左括号后面的字符串}else if(s[i] == ']'){string tmp = "";int rep = num_stk.top();num_stk.pop();while(rep--)tmp += res;res = str_stk.top() + tmp;str_stk.pop();}else{res += s[i]; }}return res;}
};

在这里插入图片描述

1个栈(参考官方,但是不喜欢)

class Solution {
public:string getDigits(string &s, size_t &ptr) {string ret = "";while (isdigit(s[ptr])) {ret.push_back(s[ptr++]);}return ret;}string getString(vector <string> &v) {string ret;for (const auto &s: v) {ret += s;}return ret;}string decodeString(string s) {vector <string> stk;size_t ptr = 0;while (ptr < s.size()) {char cur = s[ptr];if (isdigit(cur)) {// 获取一个数字并进栈string digits = getDigits(s, ptr);stk.push_back(digits);} else if (isalpha(cur) || cur == '[') {// 获取一个字母并进栈stk.push_back(string(1, s[ptr++])); } else {++ptr;vector <string> sub;while (stk.back() != "[") {sub.push_back(stk.back());stk.pop_back();}// sub push的顺序是逆序,累积前需要反过来reverse(sub.begin(), sub.end());// 左括号出栈stk.pop_back();// 此时栈顶为当前 sub 对应的字符串应该出现的次数int repTime = stoi(stk.back()); stk.pop_back();string t, o = getString(sub);// 构造字符串while (repTime--) t += o; // 将构造好的字符串入栈stk.push_back(t);}}return getString(stk);}
};

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入探究深度学习、神经网络与卷积神经网络以及它们在多个领域中的应用

目录 1、什么是深度学习&#xff1f; 2、深度学习的思想 3、深度学习与神经网络 4、深度学习训练过程 4.1、先使用自下上升非监督学习&#xff08;就是从底层开始&#xff0c;一层一层的往顶层训练&#xff09; 4.2、后自顶向下的监督学习&#xff08;就是通过带标签的数…

文件管理怎么清内存?效率提升一倍

定期清理文件管理可以释放存储空间和提高系统性能。随着时间的推移&#xff0c;手机中可能会存储大量无用的数据&#xff0c;例如缓存、垃圾文件等&#xff0c;导致系统运行缓慢。那么如何清理文件管理的内存呢&#xff1f;下面介绍三种方法。 一、搜索无用的文件夹进行清理 1…

【Bug—eNSP】华为eNsp路由器设备启动一直是0解决方案!

目录 一、项目场景 二、问题描述 三、原因分析 四、解决方案 注意&#

(二开)Flink 修改源码拓展 SQL 语法

1、Flink 扩展 calcite 中的语法解析 1&#xff09;定义需要的 SqlNode 节点类-以 SqlShowCatalogs 为例 a&#xff09;类位置 flink/flink-table/flink-sql-parser/src/main/java/org/apache/flink/sql/parser/dql/SqlShowCatalogs.java 核心方法&#xff1a; Override pu…

高阶数据结构学习 —— 图(1)

文章目录 1、并查集2、了解图3、邻接矩阵4、压缩路径5、基本概念6、邻接表 1、并查集 并查集是一个森林&#xff0c;是由多棵树组成的。这相当于整套数据&#xff0c;分成多个集合。查找有交集的集合们&#xff0c;会把它们合并起来&#xff0c;所以叫并查集。 一开始拿到的是…

电脑突然提示找不到msvcp140.dll怎么办,解决msvcp140.dll丢失的办法

当我们在电脑上运行某些软件或游戏时&#xff0c;可能会遇到一个常见的错误消息&#xff1a;“找不到msvcp140.dll”。出现这样的情况通常意味着系统缺少一个重要的动态链接库文件&#xff0c;而这可能会导致程序无法正常启动。如果你现在遇到了这个问题&#xff0c;哪有可以用…

3D LUT 滤镜 shader 源码分析

最近在做滤镜相关的渲染学习&#xff0c;目前大部分 LUT 滤镜代码实现都是参考由 GPUImage 提供的 LookupFilter 的逻辑&#xff0c;整个代码实现不多。参考网上的博文也有各种解释&#xff0c;参考了大量博文之后终于理解了&#xff0c;所以自己重新整理了一份&#xff0c;方便…

最新Microsoft Edge浏览器如何使用圆角

引入 最近我看了edge官方的文档&#xff0c;里面宣传了edge的最新UI设计&#xff0c;也就是圆角&#xff0c;但是我发现我的浏览器在升级至最新版本之后&#xff0c;却没有圆角 网上有很多人说靠实验性功能即可解锁&#xff0c;但是指令我都试过了&#xff0c;每次都是搜索无结…

OpenLayers入门,OpenLayers从vue的assets资源路径加载TopoJson文件并解析数据叠加到地图上,以加载世界各国边界为例

专栏目录: OpenLayers入门教程汇总目录 前言 本章以加载世界各国边界的TopoJson格式数据为例,讲解如何使用OpenLayers从vue的assets资源路径加载TopoJson文件并解析数据叠加到地图上。 GeoJson介绍 GEOJSON是gis地图中常用的数据格式,制作地图时用于存储各种地理数据,使…

一站式解决安全问题

端玛科技致力于攻克困难的应用软件安全问题&#xff0c;我们的解决方案以安全标准、安全教育和安全风险评估三大支柱为安全SDLC的基础&#xff0c;这三大支柱相互依存&#xff0c;创建了一个可重复的、安全的软件开发生态系统。 主要业务范围&#xff1a;关注整个软件开发过程…

基于SpringBoot的在线笔记系统

技术介绍 &#x1f525;采用技术&#xff1a;SpringSpringMVCMyBatisJSPMaven &#x1f525;开发语言&#xff1a;Java &#x1f525;JDK版本&#xff1a;JDK1.8 &#x1f525;服务器&#xff1a;tomcat &#x1f525;数据库&#xff1a;mysql &#x1f525;数据库开发工具&…

七、【图像添加水印】

文章目录 一、制作水印1、先新建图层2、新建文字图层并调好水印文字的大小与角度3、添加图层样式4、添加定义图案 二、添加水印 一、制作水印 1、先新建图层 2、新建文字图层并调好水印文字的大小与角度 3、添加图层样式 1、打开“描边” 2、选择“颜色” 4、添加定义图案 二…

spring-代理模式

代理模式 一、概念1.静态代理2.动态代理 一、概念 ①介绍 二十三种设计模式中的一种&#xff0c;属于结构型模式。它的作用就是通过提供一个代理类&#xff0c;让我们在调用目标 方法的时候&#xff0c;不再是直接对目标方法进行调用&#xff0c;而是通过代理类间接调用。让不…

Java SE 学习笔记(十八)—— 注解、动态代理

目录 1 注解1.1 注解概述1.2 自定义注解1.3 元注解1.4 注解解析1.5 注解应用于 junit 框架 2 动态代理2.1 问题引入2.2 动态代理实现 1 注解 1.1 注解概述 Java 注解&#xff08;Annotation&#xff09;又称Java标注&#xff0c;是JDK 5.0引入的一种注释机制&#xff0c;Java语…

C语言 指针进阶笔记

p和*p: 如图&#xff0c;p是指针&#xff0c;指针存放着地址&#xff0c;打印出来应该是数组的值 *p是指针里里面的元素 #include<stdio.h> int main() {int a1;int b2;int c3;int p[3]{a,b,c};printf("%d",*p); return 0; } 那么现在的打印结果应该为数组的…

2023年阿里云双11有什么优惠活动?详细攻略来了!

随着双十一的临近&#xff0c;阿里云也正式开启了双11大促&#xff0c;推出了“金秋云创季”活动&#xff0c;那么&#xff0c;2023年阿里云双11的优惠活动究竟有哪些呢&#xff1f;本文将为大家详细介绍。 一、阿里云双11活动时间 1、2023年10月27日-2023年10月31日&#xff…

java 版本企业招标投标管理系统源码+多个行业+tbms+及时准确+全程电子化

项目说明 随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大&#xff0c;公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境&#xff0c;最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范&#xff0c;以及审…

Android Studio 导出 jar

AS版本&#xff1a;Android Studio Giraffe | 2022.3.1 Patch 1 1、File——New Module——Android Library 2、mylibrary——main——新建功能类 3、mylibrary——build.gradle——android {}内复制以下代码——Sync Now //Copy类型 tasks.register(makeJar, Copy) { //删…

科普|电源自动测试系统测试的项目都有哪些?

电源自动测试系统是一种用于电源性能自动测试的集成系统&#xff0c;它可以自动检测电源模块或开关电源的输入、输出、保护等各个方面。该系统通常由数据软件和各类硬件测试仪器共同组成&#xff0c;利用通讯总线、测试夹具以及其它线缆等将仪器进行连接组成整体的系统结构&…

十大排序算法(C语言)

参考文献 https://zhuanlan.zhihu.com/p/449501682 https://blog.csdn.net/mwj327720862/article/details/80498455?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169837129516800222848165%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&…