【问题描述】[中等]
给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: 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'){multi
= multi
*10 +Integer
.parseInt(c
+"");}else{res
.append(c
);}}return res
.toString();}
2. 递归法
时间复杂度:O(N) 空间复杂度:O(N)
class Solution {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
] == '[') {String
[] temp
= dfs(i
+ 1); i
= Integer
.parseInt(temp
[0]);while (nums
> 0) {res
.append(temp
[1]);nums
--;}} else if (ss
[i
] == ']') {return new String[]{String
.valueOf(i
), res
.toString()};} else {res
.append(ss
[i
]);}i
++; }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
创作挑战赛新人创作奖励来咯,坚持创作打卡瓜分现金大奖
总结
以上是生活随笔为你收集整理的[Leedcode][JAVA][第394题][字符串解码][栈][类型转换]的全部内容,希望文章能够帮你解决所遇到的问题。
如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。