我的代码能力:-∞
1.题目
https://leetcode-cn.com/problems/decode-string/
2.分析
设置两个变量res,mutil。
遍历String中的每个字符c:
如果c是字符,加入res的尾部;
如果c是数字,将数字字符转化为数字multi;
如果c是‘[’,将当前multi和res入栈,再将multi和res清零;
如果c是’]’,出栈,res=last_res+cur_multi*res。其中,
last_res是上个 [ 到当前 [ 的字符串,例如 “3[a2[c]]” 中的 a;
cur_multi是当前 [ 到 ] 内字符串的重复倍数,例如 “3[a2[c]]” 中的 2
3.复杂度
时间复杂度 O(N),一次遍历 s;
空间复杂度 O(N),辅助栈在极端情况下需要线性空间,例如 2[2[2[a]]]。
4.代码
class Solution {
public String decodeString(String s) {
LinkedList<Integer> stk_multi=new LinkedList<>();
LinkedList<String> stk_res=new LinkedList<>();
StringBuilder res=new StringBuilder();
int multi=0;
for(Character c:s.toCharArray()){
if(c=='['){
stk_multi.addLast(multi);
stk_res.addLast(res.toString());
multi=0;
res=new StringBuilder();
}
else if(c==']'){
//
int cur=stk_multi.removeLast();
StringBuilder tmp=new StringBuilder();
for(int i=0;i<cur;i++){
tmp.append(res);
}
res=new StringBuilder(stk_res.removeLast()+tmp);
}
else if(c>='0'&&c<='9'){
multi=multi*10+(c-'0');//字符串可能超过10
}
else{
res.append(c);
}
}
return res.toString();
}
}
// 2021.12.13 八百年没写代码的我复习第一天
class Solution {
public String decodeString(String s) {
LinkedList<Integer> s_mul=new LinkedList<>();
LinkedList<String> s_res=new LinkedList<>();
int mul=0;
StringBuilder res=new StringBuilder();
for(char c:s.toCharArray()){
//数字
if(Character.isDigit(c)){
mul=mul*10+(c-'0');
}
//左括号
else if(c=='['){
s_mul.push(mul);
s_res.push(res.toString());
mul=0;
res=new StringBuilder();
}
//右括号
else if(c==']'){
int cur=s_mul.pop();
StringBuilder tmp=new StringBuilder();
for(int i=0;i<cur;i++){
tmp.append(res);
}
res=new StringBuilder(s_res.pop());
res.append(tmp);
}
//字母
else{
res.append(c);
}
}
return res.toString();
}
}
5.结果
`在