题目:

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/decode-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

本题是嵌套的括号,需要生成字符串,故利用栈先进后出的特点来解决问题,定义两个栈,一个栈numstack用来存放数字,一个栈restack用来存放字符。

遍历字符串s的每个字符c:

1.当c为数字字符时,将数字字符转换为数字,并取出连续的数字num;

2.当c为字母时,将其放在临时存放字符串的StringBuilder res尾部中;

3.当c为左括号 '['时:

  • 将上一次计算出的数字num压入栈numstack中;
  • 将上一次存放在res中的临时结果压入栈restsack中;
  • 然后重置num和临时res,给下一次遇到 '['使用

4.当c为右括号 ']' 时:

  • 取出上次压入restack中的内容;
  • 计算当前 []中重复的字符串;
  • 进行拼接

5.返回字符串res。

举例: 3[a2[c2[ab]]]  (只是模拟,写的不是很规范)

两个栈numstack和restack, StringBuilder res存储结果

i = 0时,s.charAt(i) = 3, num = 3;

i=1时,s.charAt(i) = '[':

  • 3入栈:numstack = 3
  • restack为空
  • 重置:num = 0,res 为空

i=2时,s.charAt(i) = a,res=(a);

i=3时,s.charAt(i) = 2, num = 2;

i=4时,s.charAt(i) = '[':

  • 2入栈:numstack 为(3,2)
  • 将res里面的字符加入restack,restack为(a)
  • 重置:num = 0,res 为空

i=5时,s.charAt(i) =c ,res=(c);

i=6时,s.charAt(i) = 2,num=2;

i=7时,s.charAt(i) = '[':

  • 2入栈:numstack为(3,2,2)
  • 将res里面的字符加入restack,restack为(a,c)
  • 重置:num = 0,res 为空

i=8,s.charAt(i) =a,res =(a);

i=9,s.charAt(i) =b,res =(ab);

i=10时,s.charAt(i) = ']':

  • 获取上一个倍数:numstack.pollLast() = 2(2就删除了,numstack只有3,2了);
  • temp中添加两次res:即为abab;
  • 与括号外的c合并就变成res = cabab(restack只有a了);

i=11时,s.charAt(i) = ']':

  • 获取上一个倍数:numstack.pollLast() = 2(2就删除了,numstack只有3);
  • temp中添加两次res:即为cababcabab;
  • 与括号外的a合并就变成res = acababcabab(restack为空了);

i=12时,s.charAt(i) = ']':

  • 获取上一个倍数:numstack.pollLast() = 3(numstack为空了);
  • temp中添加三次res:即为acababcababacababcababacababcabab;
  • restack为空,没法合并了

最终将res转换成字符串"acababcabab acababcababacababcabab"。

代码:

 1 class Solution {
2 public String decodeString(String s) {
3 //定义两个栈用来存放倍数和字符
4 Deque<Integer> numstack = new ArrayDeque<>();
5 Deque<StringBuilder> restack = new ArrayDeque<>();
6 //拼接数字
7 int num = 0;
8 //存放结果
9 StringBuilder res = new StringBuilder();
10
11 for(char c : s.toCharArray()){
12 //遇到数字就压入数字栈
13 if(c >= '0' && c <= '9'){
14 //取出连续的数字
15 num = num * 10 + c - '0';
16 }else if(c == '['){
17 //遇到左括号
18 //将上次计算出的数字压栈
19 numstack.addLast(num);
20 //将上一次的倍数后的结果字符存入字符栈
21 restack.addLast(res);
22 //重置数字和结果
23 num = 0;
24 res = new StringBuilder();
25 }else if(c == ']'){
26 StringBuilder temp = new StringBuilder();
27 //获取倍数
28 int count = numstack.pollLast();
29 //进行循环当前字符,拼接到上一次结果中
30 for(int i = 0; i < count; i++){
31 temp.append(res);
32 }
33 //与括号外的合并
34 res = restack.pollLast().append(temp);
35 }else{
36 res.append(c);
37 }
38 }
39 return res.toString();
40 }
41 }

力扣394(java)-字符串解码(中等)的更多相关文章

  1. 刷题-力扣-541. 反转字符串 II

    541. 反转字符串 II 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-string-ii 著作权归领扣网络所有. ...

  2. LeetCode 394:字符串解码 Decode String

    题目: 给定一个经过编码的字符串,返回它解码后的字符串. Given an encoded string, return its decoded string. 编码规则为: k[encoded_st ...

  3. 力扣541. 反转字符串 II

    原题 1 class Solution: 2 def reverseStr(self, s: str, k: int) -> str: 3 begin,lens,ans = 0,len(s),' ...

  4. Java实现 LeetCode 394 字符串解码

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

  5. LeetCode 394. 字符串解码(Decode String) 44

    394. 字符串解码 394. Decode String 题目描述 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 enco ...

  6. [LeetCode]394. 字符串解码(栈)

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

  7. 力扣Leetcode 179. 最大数 EOJ 和你在一起 字符串拼接 组成最大数

    最大数 力扣 给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 说 ...

  8. 力扣567.字符串的排列—C语言实现

    题目 来源:力扣(LeetCode)

  9. 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题

    题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...

  10. 力扣:面试题58 - II. 左旋转字符串

    菜鸡小白不禁感叹:C++真好用!!! 题目描述: 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"abcdefg& ...

随机推荐

  1. grep 第四天

    grep 第四天 1 使用grep 取 passwd 显示行数 grep -c '' /etc/passwd [root@master ~]# grep -c '' /etc/passwd 135 2 ...

  2. 记录--Vue3问题:如何实现组件拖拽实时预览功能?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 需求分析 实现一个CMS内容管理系统,在后台进行内容编辑,在官网更新展示内容. 关于后台的编辑功能,大致分为两部分:组件拖拽预览.组 ...

  3. 记录--微信小程序,uniapp,H5端发送,显示emoji表情

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 小伙伴们,在开发中有没有遇到过发布帖子或者实时聊天需要发送到一些emoji表情的. 但是每当我们直接将emoji表情提交到后台的接口又会报 ...

  4. iptables-save 命令使用总结

    转载请注明出处: iptables-save 命令在 Linux 系统中用于将当前运行的 iptables 防火墙规则导出到一个文件中.这对于备份规则.迁移规则或在不同系统间共享规则配置非常有用. 基 ...

  5. 快速上手系列:XML

    一 xml 简介extensible markup language :可扩展标记型语言(1)标记型语言:html 也是标记型语言,即使用标签来操作(2)可扩展: 1)html 里面的标签是固定的,每 ...

  6. 高防dns和高防IP一样吗?

    高防DNS和高防IP一样吗? 高防DNS和高防IP在功能和目标上有所不同,因此它们并不完全相同. 高防DNS是一种针对DNS服务的防护措施,旨在保护域名解析免受DDoS攻击等网络威胁的影响.它利用高防 ...

  7. 并发CPU伪共享及优化

    伪共享 缓存系统中是以缓存行(cache line)为单位存储的.缓存行是2的整数幂个连续字节,一般为32-256个字节.最常见的缓存行大小是64个字节.当多线程修改互相独立的变量时,如果这些变量共享 ...

  8. C#数据去重的5种方式,你知道几种?

    前言 今天我们一起来讨论一下关于C#数据去重的的5种方式,每种方法都有其特点和适用场景,我们根据具体需求选择最合适的方式.当然欢迎你在评论区留下你觉得更好的C#数据去重的方式. 使用HashSet去重 ...

  9. #拓扑排序#洛谷 5157 [USACO18DEC]The Cow Gathering P

    题目 给出一棵树和一些限制关系 \((a_i,b_i)\), 一种合法的删点序列当且仅当删除一个点之后树的大小不超过 1 或不存在孤立点, 并且 \(a_i\) 要比 \(b_i\) 先删除,问 \( ...

  10. #线段树,欧拉函数#CF1114F Please, another Queries on Array?

    题目 给一个长度为\(n\)的数组\(a\),\(q\)次询问 支持区间乘\(x\)以及求\(\varphi(\prod_{i=l}^ra_i)\) \(n\leq 4*10^5,q\leq 2*10 ...