题目描述:

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

编码规则为: 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"

思路分析:

迭代法:

本题中可能出现括号嵌套的情况,比如 2[a2[bc]],这种情况下我们可以先转化成 2[abcbc],在转化成 abcbcabcbc。我们可以把字母、数字和括号看成是独立的 TOKEN,并用栈来维护这些 TOKEN。具体的做法是,遍历这个栈:

如果当前的字符为数位,解析出一个数字(连续的多个数位)并进栈
如果当前的字符为字母或者左括号,直接进栈
如果当前的字符为右括号,开始出栈,一直到左括号出栈,出栈序列反转后拼接成一个字符串,此时取出栈顶的数字,就是这个字符串应该出现的次数,我们根据这个次数和字符串构造出新的字符串并进栈
重复如上操作,最终将栈中的元素按照从栈底到栈顶的顺序拼接起来,就得到了答案。注意:这里可以用不定长数组来模拟栈操作,方便从栈底向栈顶遍历。

class Solution {public String decodeString(String s) {StringBuilder ans=new StringBuilder();Stack<Integer> mulistack=new Stack<>();Stack<StringBuilder> anstack=new Stack<>();int multi=0;for(char c:s.toCharArray()){if(Character.isDigit(c)){multi=multi*10+c-'0';//c-'0'表示字符转换为数字}else if(c=='['){anstack.add(ans);mulistack.add(multi);ans=new StringBuilder();multi=0;}else if(Character.isLetter(c)){ans.append(c);}else{StringBuilder anstmp=anstack.pop();int tmp=mulistack.pop();for(int i=0;i<tmp;i++){anstmp.append(ans);}ans=anstmp;}}return ans.toString();}
}

递归法:

总体思路与辅助栈法一致,不同点在于将 [ 和 ] 分别作为递归的开启与终止条件:

当 s[i] == ']' 时,返回当前括号内记录的 res 字符串与 ] 的索引 i (更新上层递归指针位置);
当 s[i] == '[' 时,开启新一层递归,记录此 [...] 内字符串 tmp 和递归后的最新索引 i,并执行 res + multi * tmp 拼接字符串。
遍历完毕后返回 res。
复杂度分析:

时间复杂度 O(N),递归会更新索引,因此实际上还是一次遍历 s;
空间复杂度 O(N),极端情况下递归深度将会达到线性级别。

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() };}
}

LeetCOde-394:字符串解码相关推荐

  1. LeetCode 394. 字符串解码(栈)

    1. 题目 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正 ...

  2. leetcode 394.字符串解码 dfs

    原题链接 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string], 表示其中方括号内部的 encoded_string 正好重复 k 次.注意 k 保证为正 ...

  3. 【LeetCode】【HOT】394. 字符串解码(栈)

    [LeetCode][HOT]394. 字符串解码 文章目录 [LeetCode][HOT]394. 字符串解码 package hot;import java.util.LinkedList;pub ...

  4. LeetCode-笔记-394. 字符串解码

    LeetCode-笔记-394. 字符串解码 394. 字符串解码 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 encod ...

  5. leetcode系列-394. 字符串解码

    题目描述:给定一个经过编码的字符串,返回它解码后的字符串.编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次. 注意 k 保证为正整 ...

  6. leetcode 394. Decode String | 394. 字符串解码(用栈做表达式转换)

    题目 https://leetcode.com/problems/decode-string/ 题解 思路来源于中缀表达式,具体过程见下图草稿. 逻辑上不难,这题的槽点在 StringBuilder ...

  7. 【LeetCode笔记】394. 字符串解码(Java、递归、栈)

    文章目录 题目描述 思路 & 代码 更新版 题目描述 开心!!独立思考字符串题,还AC了,成就感满满 XD 难点应该是在于嵌套括号,那么这里实际上还要考虑到一个类似于括号匹配的事情 谈到括号, ...

  8. ·394.字符串解码

    题目描述 注意 k 保证为正整数.你可以认为输入字符串总是有效的:输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的. 此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k , ...

  9. 394. 字符串解码

    方法 算法思想:辅助栈, 时间复杂度: 空间复杂度: 边界条件: 补充知识: class Solution { public String decodeString(String s) { Strin ...

  10. 【每日一题】字符串解码

    文章目录 题目描述 题解 递归 利用栈 题目描述 394. 字符串解码 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 enc ...

最新文章

  1. 经纬度绘图_【知识科普】地形图图例汇总,测绘人识图绘图必备(含dwg版下载)...
  2. boost::io::ostream_put用法的测试程序
  3. MySQL查询报错ERROR:No query specified
  4. c语言空格键么 有什么意义,C语言里这个空格键跟'\0'到底啥区别啊?
  5. 编程语言---自己常用网站整理
  6. iOS UI-自动布局(Autoresizing)
  7. SQL Server 数据库做读写分离
  8. Notes配置初始化和重新设置(不卸载)
  9. 20200624每日一句
  10. 小幅震荡市场下的期权投资策略举例
  11. opencv录制视频 python_OpenCV Python 录制视频
  12. Eclipse英文版视频教程(from Carleton University)
  13. “改造” VS Code 编辑器,一起写个插件吧!
  14. 红帽环境+docker安装
  15. 软件设计师-计算机网络知识
  16. android 普通对话框,android 普通对话框
  17. hdu 4546 输入n个数 问这n个数相加组成的第K小的数是什么
  18. 14 Python总结之风险管理
  19. iOS通知和KVO的区别和用法
  20. Mitmproxy 配置二级代理

热门文章

  1. Map 遍历的几种方法
  2. path、classpath理解
  3. [转]微软代码示例:ASP.NET 2.0 三层架构应用程序教程系列
  4. 2014计算机二级vfp,2014计算机二级VF考前试题解析
  5. mi max android 8.1,小米这款手机可以升级安卓 8.1 了!
  6. c# 再次尝试 连接失败_手机投屏电视连接不上怎么回事?
  7. Java学科课程大纲
  8. python 把多个list合并为一个并去重内容_110道Python面试题(上)
  9. 直播丨 SQL大赛冠军怀晓明:深入解析Oracle存储过程中的性能瓶颈
  10. MySQL 5.7 update误操作后数据恢复详解