2022-11-10 15:38阅读: 36评论: 0推荐: 0

力扣-394-字符串解码

字符编辑题,最麻烦
重点是这里包含了嵌套,感觉要用到栈,但是用栈怎么做到字符串跟打印数量绑定呢?…复合数据结构?或者两个栈?

遇到数字压数字栈,遇到'['开始接收字符串,在遇到'数字'或']'压字符串栈

  • 数字就循环这一过程
  • ']'就弹一个栈

看题解确实是用两个栈,但是怎么写却很麻烦

string decodeString(string s) {
stack<int> nums;
stack<string> strs;
string num,str,res;
int n = s.size();
int i = 0;
while (i < n) {
// 获取数字或者字符串输入
if (s[i] >= '0' && s[i] <= '9') {
while (s[i] >= '0' && s[i] <= '9' && i < n) {
num += s[i];
i++;
}
}
else if (s[i]>='a'&&s[i]<='z') {
while (s[i] >= 'a' && s[i] <= 'z' && i<n) {
str += s[i];
i++;
}
}
else if (s[i] == '[') {
if (!num.empty()) {
nums.push(stoi(num));
num.clear();
}
if (!str.empty()) {
strs.push(str);
str.clear();
}
i++;
}
else if (s[i] == ']') {
if (!num.empty()) {
nums.push(stoi(num));
num.clear();
}
if (!str.empty()) {
strs.push(str);
str.clear();
}
while (!nums.empty()) {
for (int i = 0; i < nums.top(); i++) res += strs.top();
nums.pop();
strs.pop();
}
i++;
}
}
if (!str.empty()) res += str;
return res;
}

就完成了实例1,3,2嵌套,4相当于0层嵌套,其实这个打印操作才是应该放到栈中的

不行了,写了一个多小时,好不容易搞定了4个测试用例,还是过不了"3[z]2[2[y]pq4[2[jk]e1[f]]]ef"
然后每次写这种题都感觉自己写得很烂很不优雅

感觉这种题也还是多少有技巧的吧

string decodeString(string s) {
stack<int> nums;
stack<string> strs;
string num,str,res,temp;
int n = s.size();
int i = 0;
while (i < n) {
// 获取数字或者字符串输入
if (s[i] >= '0' && s[i] <= '9') {
while (s[i] >= '0' && s[i] <= '9' && i < n) {
num += s[i];
i++;
}
}
else if (s[i]>='a'&&s[i]<='z') {
while (s[i] >= 'a' && s[i] <= 'z' && i<n) {
str += s[i];
i++;
}
}
else if (s[i] == '[') {
if (nums.empty()) {
if (!str.empty()) {
res += str;
str.clear();
}
}
else {
if (!str.empty()) {
strs.push(str);
str.clear();
}
}
nums.push(stoi(num));
num.clear();
i++;
}
else if (s[i] == ']') {
if (!num.empty()) {
nums.push(stoi(num));
num.clear();
}
if (!str.empty()) {
strs.push(str);
str.clear();
}
while (!nums.empty()) {
for (int i = 0; i < nums.top(); i++) temp += strs.top();
nums.pop();
if (!nums.empty()) {
strs.top() += temp;
temp.clear();
}else strs.pop();
}
res += temp;
temp.clear();
i++;
}
}
if (!str.empty()) res += str;
return res;
}

安心看题解,我尽力了

string decodeString(string s) {
string res,temp;
// 用动态数组模拟栈
// 这里只用了一个栈,因为弹栈'['的下一个一定是数字
vector<string> stk;
int i = 0;
while (i < s.size()) {
// 读连续的数字
if (isdigit(s[i])) {
// 数字不可能是最后一个,所以这里不加i<n
while (isdigit(s[i])) temp += s[i++];
stk.push_back(temp);
temp.clear();
}
else if(isalpha(s[i])||s[i]=='[') {
stk.push_back(string(1,s[i++]));
}
else {
i++;
while (stk.back() != "[") {
// 获取字符串
temp = stk.back() + temp;
stk.pop_back();
}
stk.pop_back();// 弹出左括号
string str;
int j = stoi(stk.back());
stk.pop_back();// 弹出用掉的数字
while (j--) str += temp;
temp.clear();
stk.push_back(str);
}
}
// "abc3[cd]xyz"可能还剩下像abc这样的
for (string s : stk) res += s;
return res;
}

题解这边就是要字符和'['一起入栈,遇到']'就取一个数字打印栈中直到'['的字符,并刷新入栈

由于题目性质,‘[’前面一定是数字,所以可以只用一个栈

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16877253.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(36)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起