力扣-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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步