LeetCode394.字符串解码

 这道题有点像我之前写过的一道题有效的括号(不只是栈)-CSDN博客

 但是比那道题要难,但用的方法是一样的,就是用栈的先进后出进行括号匹配,所以有写过之前那道题,这道题按照这个思路走我就写出了如下屎山代码:

class Solution {public String decodeString(String s) {int n = s.length();Stack<Character> stack = new Stack<>();String ans = "";for(int i =0;i<n;i++){char c = s.charAt(i);if(c != ']'){stack.push(c);}else{String tmp = "";while(!stack.isEmpty()){char c1 = stack.pop();if(c1 != '['){tmp = c1 + tmp;}else{int num = stack.pop() -48;int m =1;while(!stack.isEmpty() && stack.peek() <= 57){int mask =  (int)Math.pow(10,m);num = num + (int)(stack.pop() -48)*mask;m++;}char[] charArr = tmp.toCharArray(); for(int k =0;k<num;k++){for(int j=0;j<charArr.length;j++){stack.push(charArr[j]);}}break;}}}}while(!stack.isEmpty()){ans = stack.pop() + ans;}return ans;}
}

 我这个就非常好理解,遍历s的每个字符,只要不是“]”就直接放;如果是那么就从stack里面把字符拿出来拼接,如果拿出来的这个字符是"[",那么再把[前面的数字拿出来(可能是多位数)num,然后把这个把这个拼接出来的字符串一位一位的放回stack,放num遍,遍历完了s所有的字符之后,把stack里面的字符连起来就是ans,返回ans即可。

比如“3[a2[c]]”,一开始stack里面放的是3[a2[c,然后遇到了],就把c拿出来,把2*c放回去,现在stack里面是3[acc,然后又遇到了],把acc拿出来,把3*acc放回去,stack里面现在是accaccacc,遍历完了返回accaccacc。

因为效率有点慢只超过了11%,我就想能不能拿到括号里的字符串就不放回stack了,于是我把放回stack那一部分改成了递归写了如下代码:

class Solution {public String decodeString(String s) {if(!s.contains("[")){return s;}int n = s.length();Stack<Character> stack = new Stack<>();for(int i =0;i<n;i++){char c = s.charAt(i);if(c != ']'){stack.push(c);}else{String tmp = "";while(!stack.isEmpty()){char c1 = stack.pop();if(c1 != '['){tmp = c1 + tmp;}else{int num = 0;int m =0;String p = "";while(!stack.isEmpty() && stack.peek() <= 57){int mask =  (int)Math.pow(10,m);num = num + (int)(stack.pop() -48)*mask;m++;}p = tmp;for(int k =0;k<num-1;k++){tmp += p;}s= s.substring(0,i-1-p.length()-m) + tmp + s.substring(i+1,n);if(s.contains("[")){return decodeString(s);}else{return s;}}}}}return s;}
}

比如"3[a2[c]]",stack里面是3[a2[c,然后遇到了],于是拿出了cc,然后把s变成“3[a” + “cc” + "]"也就是“3[acc]”。然后再判断“3[acc]”里面有没有“[”,如果没有说明全部括号都消掉了,直接返回这个s即如果还有括号,则递归调用decodeString(s)再消掉一个括号。算法没问题,但是没软用,依旧是超过11%。

看看题解做法吧。

题解的做法一和我第一种的思想是一样的就是从stack中拿出来字符串后乘以倍数又返回栈,但是它的的效率超过了77%,它相比于我就是一点优化,它stack放的是String而我放的是char,所以它遍历到一个字母字符后就把后面连串的字符拼接放进去。比如“100[leetcode]”,我是放了100个[l,e,e,t,c,o,d,e]而它放的是100个leetcode,无论是空间还是时间都效率更高,以下是题解方法一代码:

class Solution {int ptr;public String decodeString(String s) {LinkedList<String> stk = new LinkedList<String>();ptr = 0;while (ptr < s.length()) {char cur = s.charAt(ptr);if (Character.isDigit(cur)) {// 获取一个数字并进栈String digits = getDigits(s);stk.addLast(digits);} else if (Character.isLetter(cur) || cur == '[') {// 获取一个字母并进栈stk.addLast(String.valueOf(s.charAt(ptr++))); } else {++ptr;LinkedList<String> sub = new LinkedList<String>();while (!"[".equals(stk.peekLast())) {sub.addLast(stk.removeLast());}Collections.reverse(sub);// 左括号出栈stk.removeLast();// 此时栈顶为当前 sub 对应的字符串应该出现的次数int repTime = Integer.parseInt(stk.removeLast());StringBuffer t = new StringBuffer();String o = getString(sub);// 构造字符串while (repTime-- > 0) {t.append(o);}// 将构造好的字符串入栈stk.addLast(t.toString());}}return getString(stk);}public String getDigits(String s) {StringBuffer ret = new StringBuffer();while (Character.isDigit(s.charAt(ptr))) {ret.append(s.charAt(ptr++));}return ret.toString();}public String getString(LinkedList<String> v) {StringBuffer ret = new StringBuffer();for (String s : v) {ret.append(s);}return ret.toString();}
}

 题解方法二用的是递归:

class Solution {public String decodeString(String s) {return dfs(s, 0)[0];}private String[] dfs(String s, int i) {StringBuilder res = new StringBuilder();int multi = 0;while(i < s.length()) {if(s.charAt(i) >= '0' && s.charAt(i) <= '9') multi = multi * 10 + Integer.parseInt(String.valueOf(s.charAt(i))); else if(s.charAt(i) == '[') {String[] tmp = dfs(s, i + 1);i = Integer.parseInt(tmp[0]);while(multi > 0) {res.append(tmp[1]);multi--;}}else if(s.charAt(i) == ']') return new String[] { String.valueOf(i), res.toString() };else res.append(String.valueOf(s.charAt(i)));i++;}return new String[] { res.toString() };} 
}

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

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

相关文章

使用宝塔面板部署前端项目到服务器

目录 文章目录 前言 一、第一步&#xff1a;创建文件夹 二、第二步&#xff1a;部署前端项目 三、第三步&#xff1a;打开防火墙 文章目录 前言第一步&#xff1a;创建文件夹第二步&#xff1a;部署前端项目第三步&#xff1a;打开防火墙总结 前言 在此之前&#xff0c;我…

智能优化算法应用:基于鹰栖息算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鹰栖息算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鹰栖息算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鹰栖息算法4.实验参数设定5.算法结果6.参考文…

DHorse v1.5.0 发布,基于 k8s 的发布平台

版本说明 新增特性 支持同一机器部署多个DHorse服务&#xff1b;支持Next、.NET应用部署&#xff1b;优化Node、Nuxt应用构建和部署的性能&#xff1b;默认使用fabric8客户端与k8s集群交互&#xff0c;可以通过指定参数-Dkubernetes-clientofficial切回到k8s官方客户端&#…

亚马逊推出 Graviton4:具有 536.7 GBps 内存带宽的 96 核 ARM CPU

如今&#xff0c;许多云服务提供商都设计自己的芯片&#xff0c;但亚马逊网络服务 (AWS) 开始领先于竞争对手&#xff0c;目前其子公司 Annapurna Labs 开发的处理器可以与 AMD 和英特尔的处理器竞争。本周&#xff0c;AWS 推出了 Graviton4 SoC&#xff0c;这是一款基于 ARM 的…

【Filament】绘制圆形

1 前言 Filament环境搭建中介绍了 Filament 的 Windows 和 Android 环境搭&#xff0c;绘制三角形中介绍了绘制纯色和彩色三角形&#xff0c;绘制矩形中介绍了绘制纯色和彩色矩形&#xff0c;本文将使用 Filament 绘制圆形。 2 绘制圆形 本文项目结构如下&#xff0c;完整代码…

RetinaNet:Focal Loss for Dense Object Detection(CVPR2018)

文章目录 Abstract北京发现问题并给出方法成果 IntroductionRelated WorkRobust 评估 Focal LossBalanced Cross EntropyFocal Loss DefinitionClass Imbalance and Model InitializationClass Imbalance and Two-stage Detectors RetinaNet DetectorExperimentsConclusion hh …

基于SpringBoot的桃花峪滑雪场租赁系统 JAVA简易版

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设计3.1 教练表3.2 教练聘请表3.3 押金规则表3.4 器材表3.5 滑雪场表3.7 售票表3.8 器材损坏表 四、系统展示五、核心代码5.1 查询教练5.2 教练聘请5.3 查询滑雪场5.4 滑雪场预定5.5 新…

WebAssembly 的魅力:高效、安全、跨平台(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

JUC并发编程 08——原子操作类

目录 一.原子更新基本类型类 实现原理 二.原子更新数组 三.原子更新引用类型 四.原子更新字段类 Java从JDK1.5开始提供了J.U.C下的atomic包&#xff0c;atomic包提供了一系列的操作简单&#xff0c;性能高效&#xff0c;并能保证线程安全的类去更新基本类型变量&#xff0…

WebAssembly 的魅力:高效、安全、跨平台(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Unity中的导航系统

NavMesh(导航网格)是3D游戏世界中用于实现动态物体自动寻路的一种技术&#xff0c;将游戏中复杂的结构组织关系简化为带有一定信息的网格&#xff0c;在这些网格的基础上通过一系列的计算来实现自动寻路。导航时&#xff0c;只需要给导航物体挂载导航组建&#xff0c;导航物体便…

【Grafana】Grafana匿名访问以及与LDAP连接

上一篇文章利用Docker快速部署了Grafana用来展示Zabbix得监控数据&#xff0c;但还需要给用户去创建账号允许他们登录后才能看展示得数据&#xff0c;那有什么办法让非管理员更方便得去访问Grafana呢&#xff1f;下面介绍两个比较方便实现的&#xff1a; 在开始设置前&#xff…

显示器屏幕oled的性能、使用场景、维护

OLED显示器屏幕具有许多独特的性能和使用场景&#xff0c;以下是关于OLED显示器屏幕的性能、使用场景和维护的详细介绍&#xff1a; 一、性能 色彩鲜艳&#xff1a;OLED显示器屏幕能够呈现出更加鲜艳的色彩&#xff0c;色彩饱和度高&#xff0c;色彩还原性好&#xff0c;可以给…

SpringBoot+JaywayJsonPath实现Json数据的DSL(按照指定节点表达式解析json获取指定数据)

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_前后端分离项目本地运行-CSDN博客 在上面搭建SpringBoot项目的基础上&#xff0c;并且在项目中引入fastjson、hutool等所需依赖后。 Jayway JsonPat…

【【C++11特性篇】【强制/禁止 】生成默认函数的关键字default&delete(代码演示)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》…

动物分类识别教程+分类释义+界面展示

1.项目简介 动物分类教程分类释义界面展示 动物分类是生物学中的一个基础知识&#xff0c;它是对动物进行分类、命名和描述的科学方法。本教程将向您介绍动物分类的基本原则和方法&#xff0c;并提供一些常见的动物分类释义。 动物分类的基本原则 动物分类根据动物的形态、…

vue3老项目如何引入vite

vue3老项目如何引入vite 安装 npm install vite vitejs/plugin-vue --save-dev Vite官方中文文档修改package.json文件 在 npm scripts 中使用 vite 执行文件 "scripts": {"serve": "vite","build": "vite build","pr…

听GPT 讲Rust源代码--src/tools(22)

File: rust/src/tools/tidy/src/lib.rs rust/src/tools/tidy/src/lib.rs是Rust编译器源代码中tidy工具的实现文件之一。tidy工具是Rust项目中的一项静态检查工具&#xff0c;用于确保代码质量和一致性。 tidy工具主要有以下几个作用&#xff1a; 格式化代码&#xff1a;tidy工具…

Rust报错:the msvc targets depend on the msvc linker but `link.exe` was not found

当我在我的 windows 电脑上安装 rust&#xff0c;然后用 cargo 新建了一个项目后&#xff0c;cargo run 会报错&#xff1a; error: linker link.exe not found| note: program not foundnote: the msvc targets depend on the msvc linker but link.exe was not foundnote: p…

css学习笔记6(盒子模型)

CSS盒子模型 五、CSS盒子模型1.CSS长度单位2.元素的显示模式3.总结各元素的显示模式4.修改元素显示模式5.盒子模型的组成6.盒子内容区&#xff08;content&#xff09;7.关于默认宽度8.盒子内边距&#xff08;padding&#xff09;9.盒子边框&#xff08;border&#xff09;10.盒…