avatar

目录
字符串+栈
  1. 字符串解码
    相信会有人疑惑为什么官方视频例子里,s = “3[a2[c]]” 存的是[[2, a]而不是[2,c]呢?请看下面解答:
    看完此题很容易就联想到栈,因为涉及到优先级最能层的括号先计算,其实这道题类似于分配率。
    第一步是如何设计栈,有一个是数字代表重复次数,一个字符串代表要重复的字符串,很容易联想到用两个栈来存,分别存数字和字符串,存储进入’[‘前的状态(这里存的数字代表[]运算完后内部的字符串需要重复的次数,字符代表进入’[‘前需要存的字符。
    接下来是怎么存?首先先用一个int num存储当前遍历的数,string res存储当前遍历到的字符串,当遇到’[‘的时候代表我们要先计算’[‘后的内容,当前计算得部分需要先存起来,当遇到’]‘时,将当前的res重复num次与栈最上层的字符串拼接,也就是进入当前’[‘时的状态,直到遍历结束,每遇到一次’[‘一次入栈,一次’]'一次出栈正好对应。
c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public:
string decodeString(string s) {
stack<int> nums;
stack<string> strs;
int num = 0;
string res;
for(int i = 0; i < s.size(); i++){
if(s[i] >= '0' && s[i] <= '9')
num = num * 10 + s[i] - '0';
else if((s[i] >= 'a' && s[i] <= 'z') ||(s[i] >= 'A' && s[i] <= 'Z'))
res = res + s[i];
else if(s[i] == '['){
nums.push(num);
strs.push(res);
res = "";
num = 0;
}
else{
int cur = nums.top();
nums.pop();
string cur_str ;
for(int i = 0; i < cur; i++){
cur_str += res;
}
res = strs.top() + cur_str;
strs.pop();
}
}
return res;
}
};
文章作者: Sunxin
文章链接: https://sunxin18.github.io/2020/10/19/string-stack/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 lalala
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论