[Leedcode][JAVA][第394题][字符串解码][栈][类型转换]

【问题描述】[中等]

给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例:s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".

【解答思路】

1. 辅助栈法

在这里插入图片描述
时间复杂度:O(N) 空间复杂度:O(N)

 public String decodeString(String s) {StringBuilder res = new StringBuilder();int multi = 0 ; LinkedList<Integer> stack_multi = new LinkedList<>();LinkedList<String> stack_res = new LinkedList<>();for(Character c: s.toCharArray()){if(c == '['){stack_multi.addLast(multi);stack_res.addLast(res.toString());multi = 0;res = new StringBuilder();}else if(c == ']'){StringBuilder tmp = new StringBuilder();int cur_multi =stack_multi.removeLast();for(int i = 0;i<cur_multi;i++){tmp.append(res);}res = new StringBuilder(stack_res.removeLast()+tmp);}else if(c >='0' && c<='9'){//次数大于10时需要累计multi = multi *10 +Integer.parseInt(c+"");}else{res.append(c);}}return res.toString();}
2. 递归法

在这里插入图片描述
时间复杂度:O(N) 空间复杂度:O(N)

class Solution {//空间换时间,同时避免递归传这种不会改变的参数//String.charAt()会多一个越界的判断,其实这里不转为数组也可以,个人习惯char[] ss;public String decodeString(String s) {this.ss = s.toCharArray();return dfs(0)[0];}private String[] dfs(int i) {int nums = 0;StringBuilder res = new StringBuilder();while (i < ss.length) {//是数字,因为不一定只有个位,所以需要进位计算if (Character.isDigit(ss[i])) {nums = nums * 10 + (ss[i] - '0');//如果是'[',就是重复字符串的开始位置} else if (ss[i] == '[') {//因为可能会嵌套n[字符串],所以需要进入递归String[] temp = dfs(i + 1);  //这里是16行//将指针移动到结尾的']'位置,中间的内容在下面的while中已经填充完毕i = Integer.parseInt(temp[0]);//根据nums循环填充目标字符串while (nums > 0) {res.append(temp[1]);nums--;}//如果是']',说明已经输出完成,其实只在进入递归后有效,第一次调用dfs的栈帧永远不会走进这个判断} else if (ss[i] == ']') {//此处为什么是i呢?因为这层return到的是递归方法调用处,即返回至16行所在,不可能返回到初次调用的位置//所以需要记录']'出现的位置,至于为什么不+1,是因为走完16行所在的代码块会走到34行return new String[]{String.valueOf(i), res.toString()};//类似于2[abc]3[cd]ef中的ef,没有循环次数,可以直接填充} else {res.append(ss[i]);}//移动指针i++;  //这里是34行}return new String[]{res.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() };} 
}

【总结】

1.为什么用LinkedList不用Stack

基于 Vector 实现的栈 Stack底层是数组 扩容开销大
Java并不推荐使用java.util.stack来进行栈的操作,而是推荐使用一个双端队列deque
详情链接:https://www.cnblogs.com/cosmos-wong/p/11845934.html

2.细节

2.1 转字符串
1、toString,需要保证调用这个方法的类、方法、变量不为null,否则会报空指针。

2、String.valueOf。这个方法在使用的时候是有些特殊的。一般情况下,如果是确定类型的null传入,返回的是字符串“null”,而如果直接传入null,则会发生错误。
在这里插入图片描述

3、(String) 字符串类型强转。需要保证的是类型可以转成String类型。

2.2 、2.3 应用于提取字符串中的数字字符转整形

2.2 字符转整型

 Integer.parseInt(c + "");

2.3 字符串中某字符转整型

 Integer.parseInt(String.valueOf(s.charAt(i))); 
3.括号匹配 栈栈栈
4.包装类的用法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
转载链接:https://leetcode-cn.com/problems/decode-string/solution/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/
参考链接:https://blog.csdn.net/yangzhaomuma/article/details/51173138

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

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

相关文章

2019昆明计算机会议,计算机 | ACSAC 2019等国际会议信息6条

图形学与多媒体IPTA 2019International Conference on Image Processing Theory, Tools and Applications全文截稿: 2019-06-02开会时间: 2019-11-06会议难度: ★★CCF分类: 无会议地点: Istanbul, Turkey网址&#xff1a;http://www.ipta-conference.com/ipta19/The ninth Int…

html:(13):ol-li和div作用

使用ol&#xff0c;添加图书销售排行榜 如果想在网页中展示有前后顺序的信息列表&#xff0c;怎么办呢&#xff1f;如&#xff0c;当当网上的书籍热卖排行榜&#xff0c;如下图所示。这类信息展示就可以使用<ol>标签来制作有序列表来展示。 语法&#xff1a; <ol>…

粮草先行——Android折叠屏开发技术点番外篇之运行时变更处理原则

上一篇文章中&#xff0c;我们有提到Activity在屏幕尺寸发生变更时的处理方式&#xff0c;总共有两种&#xff1a; 重启APP以适应屏幕改变&#xff1b;手动处理数据&#xff0c;避免APP重启。同样&#xff0c;这两种方式也同时适用于改变屏幕方向、更改系统语言、甚至输入法等等…

Not Equal on a Segment CodeForces - 622C

You are given array a with n integers and m queries. The i-th query is given with three integers li, ri, xi. For the i-th query find any position pi (li ≤ pi ≤ ri) so that api ≠ xi. InputThe first line contains two integers n, m (1 ≤ n, m …

[剑指offer][JAVA]面试题第[05]题[替换空格][StringBuilder/Buffer]

【问题描述】[简单] 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。示例 1&#xff1a;输入&#xff1a;s "We are happy." 输出&#xff1a;"We%20are%20happy."限制&#xff1a;0 < s 的长度 < 10000【解答思路】 …

计算机表格最高分,excel表格里怎样算最高分

在Excel中录入好数据以后进行数据统计&#xff0c;再统计过后多数需要算出最高值得&#xff0c;有些朋友可能不太会求最高值&#xff0c;接下来是学习啦小编为大家带来的excel如何求最高值的方法&#xff0c;欢迎大家来到学习啦学习。excel表格算最高分的方法1&#xff1a;下图…

html:(14):给div命名和table标签

给div命名&#xff0c;使逻辑更加清晰 在上一小节中&#xff0c;我们把一些标签放进<div>里&#xff0c;划分出一个独立的逻辑部分。为了使逻辑更加清晰&#xff0c;我们可以为这一个独立的逻辑部分设置一个名称&#xff0c;用id属性来为<div>提供唯一的名称&…

缓存过期时间的设置

使用 slidingExpiration 时间时&#xff0c;如果再次命中&#xff0c;将延长缓存项目的生命期使用 expireTime 时&#xff0c;无论是否命中&#xff0c;时间到时&#xff0c;都将失效。 转载于:https://www.cnblogs.com/yyj/p/10373882.html

不要62-三种写法

杭州人称那些傻乎乎粘嗒嗒的人为62&#xff08;音&#xff1a;laoer&#xff09;。 杭州交通管理局经常会扩充一些的士车牌照&#xff0c;新近出来一个好消息&#xff0c;以后上牌照&#xff0c;不再含有不吉利的数字了&#xff0c;这样一来&#xff0c;就可以消除个别的士司机…

杜克大学计算机硕士要几年,2017杜克大学春季不招计算机专业的硕士?

原标题&#xff1a;2017杜克大学春季不招计算机专业的硕士&#xff1f;计算机科学&#xff0c;理工科中常申请的一个专业&#xff0c;每一年都会有大批的计算机同学奔赴战场&#xff0c;准备材料&#xff0c;刷托福GRE考高分&#xff0c;只为等待自己心中梦寐以求学校的那片橄榄…

[剑指offer][JAVA]面试题第[06]题[从尾到头打印链表][栈][递归]

【问题描述】[简单] 输入一个链表的头节点&#xff0c;从尾到头反过来返回每个节点的值&#xff08;用数组返回&#xff09;。示例 1&#xff1a;输入&#xff1a;head [1,3,2] 输出&#xff1a;[2,3,1]限制&#xff1a; 0 < 链表长度 < 10000【解答思路】 1. 常规思路…

jQuery使用(八):运动方法

show()、hide()、toggle()参数&#xff1a;null或(duration,easing,callblack)fadeIn()、fadeout()、fadeToggle()、fadeTo()参数&#xff1a;null或(duration,[opacity],easing,callblack)slideDown(),slideUp(),slideToggle()参数&#xff1a;null或(duration,easing,callbla…

服务器重装后怎么装系统,服务器如何安装系统,小编教你如何安装

相对于普通PC来说&#xff0c;服务器有很多优点&#xff0c;比如在工作上的效率会比PC高出许多&#xff0c;但也有一些缺点其中的服务器系统的安装有时候缺乏人性化就是原因之一了。第一次安装服务器系统&#xff0c;会遇到很多麻烦&#xff0c;下面&#xff0c;小编就给大家带…

html:(15):用css样式给表格添加边框和caption标签

用css样式&#xff0c;为表格加入边框 Table 表格在没有添加 css 样式之前&#xff0c;是没有边框的。这样不便于我们后期合并单元格知识点的讲解&#xff0c;所以在这一节中我们为表格添加一些样式&#xff0c;为它添加边框。 在右侧代码编辑器中添加如下代码&#xff1a; …

Java集合容器面试题

文章目录集合容器概述什么是集合集合的特点集合和数组的区别使用集合框架的好处常用的集合类有哪些&#xff1f;List&#xff0c;Set&#xff0c;Map三者的区别&#xff1f;List、Set、Map 是否继承自 Collection 接口&#xff1f;List、Map、Set 三个接口存取元素时&#xff0…

Ubuntu Linux 解决 bash ./ 没有那个文件或目录 的方法

Ubuntu Linux 解决 bash ./ 没有那个文件或目录 的方法 遇到这个问题是为了sublime配置c/c 编译环境 当运行程序打开终端时 出现以上问题 先新建build system 用以下代码 {"shell_cmd": "g \"${file}\" -o \"${file_path}/${file_base_name}\&qu…

sql server 备份计划

SSMS 1.管理 2.维护计划 3.维护计划向导 或者 1. server 代理 2. 作业 3. 新建作业 备份计划时间尽量选在闲时&#xff0c; 例如午夜 转载于:https://www.cnblogs.com/dream-life/p/10380621.html

荒野行动服务器维护,荒野行动11月30日维护更新完毕服务器已开放 ! 更新优化内容说明...

荒野行动11月30日服务器维护完了&#xff0c;这里手机乐园寻隐者不遇小编给大家带来了具体的优化和更新的内容&#xff0c;咱们往下看&#xff01;亲爱的荒野精英们&#xff1a;欢迎加入《荒野行动》&#xff0c;享受畅快的射击竞技游戏。我们计划在北京时间11月30日凌晨6-8点&…

html:(16):a标签

使用<a>标签&#xff0c;链接到另一个页面 使用<a>标签可实现超链接&#xff0c;它在网页制作中可以说是无处不在&#xff0c;只要有链接的地方&#xff0c;就会有这个标签。 语法&#xff1a; <a href"目标网址" title"鼠标滑过显示的文本…

CodeForces - 660C Hard Process

题意就是 在这个数串中插入1构成一个最长的连续1的区间串 如何做&#xff1f;我们可以对长度进行二分 从1到n二分长度 然后在对这个长度拿到数串中查看是否能构成最终我们想要的最长匹配串 这里我们可以利用一个前缀和数组 统计从1到i的0的个数 由于必然是递增数组 就满足了二…