当前位置: 首页 > news >正文

【LeetCode热题100】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]

四.解题思路

维护一个数字栈一个字母栈,遇到数字处理后存入数字栈,遇到字母或者左括号压入字母栈,遇到右括号弹出直到左括号的所有字母,并弹出这个左括号,然后弹出一个数字栈的数字进行计算,结果全部压回字母栈,以此类推。

五.代码实现

class Solution {
public:int toInt(string str) {int val = 0;int d = 1;for (string::iterator it = str.end() - 1; it > str.begin(); it--){val += d * (*it - '0');d *= 10;}val += d * (*str.begin() - '0');return val;}string decodeString(string s) {string tmp;stack<char> stk;stack<int> n;string num;string tmptotal;for (auto c : s){if (c >= '0' && c <= '9')num += c;else{if (num != ""){n.push(toInt(num));num = "";}if ((c >= 'a' && c <= 'z') || c == '['){stk.push(c);}else if (c == ']'){while (stk.top() != '['){tmp += stk.top();stk.pop();}stk.pop();int ci = n.top();n.pop();while (ci--){tmptotal += tmp;}for (int i = tmptotal.size() - 1; i >= 0; i--) stk.push(tmptotal[i]);tmp = "";tmptotal = "";}}}string ans1;while (!stk.empty()){ans1 += stk.top();stk.pop();}string ans2;for (int i = ans1.size() - 1; i >= 0; i--) ans2 += ans1[i];return ans2;}
};

六.题目总结

字符串的题典中典折磨

相关文章:

  • 保障校园网络安全用堡垒机的几个原因分析
  • 武汉星起航:深化跨境电商理解,一站式服务助力合作伙伴稳健发展
  • Spark部署详细教程
  • python基于django的高校迎新系统 flask新生报到系统
  • c++ 堆栈内存、引用和指针 - 学习总结
  • 网络时间同步设备(时间同步系统)操作及应用方案
  • 用静态工厂方法代替构造器
  • 11.子串简写
  • 【行业颠覆者】桔数安康签约首发,开创养老服务新篇章!
  • 数字化接口、网络身份证实名认证接口、C#实名认证接口说明示例
  • 微服务篇-C 深入理解第一代微服务(SpringCloud)_VII 深入理解Swagger接口文档可视化管理工具
  • 蓝桥杯算法基础(32):素数,埃式筛法,快速幂,斐波那契与矩阵幂运算
  • 【项目技术介绍篇】若依开源项目RuoYi-Cloud后端技术介绍
  • 前端开发学习笔记(1)
  • 音频RK809
  • Codepen 每日精选(2018-3-25)
  • JavaScript的使用你知道几种?(上)
  • JS函数式编程 数组部分风格 ES6版
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • spring-boot List转Page
  • webgl (原生)基础入门指南【一】
  • 包装类对象
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 回顾 Swift 多平台移植进度 #2
  • 开发基于以太坊智能合约的DApp
  • 马上搞懂 GeoJSON
  • 如何在GitHub上创建个人博客
  • 我建了一个叫Hello World的项目
  • 以太坊客户端Geth命令参数详解
  • 用element的upload组件实现多图片上传和压缩
  • ​低代码平台的核心价值与优势
  • #pragma pack(1)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (zhuan) 一些RL的文献(及笔记)
  • (黑马C++)L06 重载与继承
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (实战篇)如何缓存数据
  • (算法设计与分析)第一章算法概述-习题
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)EOS中账户、钱包和密钥的关系
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net下的富文本编辑器FCKeditor的配置方法
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @property python知乎_Python3基础之:property
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [<MySQL优化总结>]
  • [20140403]查询是否产生日志
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式