LeetCodehot100-394 字符串解码
class Solution { public: string decodeString(string s) { // pair 里存的是左括号前的倍数, 左括号前的字符串 stackpairint, string st; int time 0; // 记录当前的倍数注意初始化为 0 string result ; // 记录当前的字符串 for (int i 0; i s.size(); i) { char c s[i]; if (isdigit(c)) { // 处理多位数字 time time * 10 (c - 0); } else if (isalpha(c)) { // 如果是字母直接加到当前 result 里 result c; } else if (c [) { // 遇到 [开始存档并清空当前状态给括号内使用 st.emplace(time, result); time 0; result ; } else if (c ]) { // 遇到 ]提取存档 auto [last_time, last_string] st.top(); st.pop(); // 将括号里的内容 (也就是现在的 result) 翻倍 string temp ; for (int k 0; k last_time; k) { temp result; } // 拼接到进括号前的历史字符串后面成为新的 result result last_string temp; } } return result; } };time time * 10 (c - 0);处理多位数字例如123依次得到1 → 12 → 123输入3[a2[c]]步骤字符timeresult栈133空2[0[(3, )]3a0a[(3, )]422a[(3, )]5[0[(3, ), (2, a)]6c0c[(3, ), (2, a)]7]0a c×2 acc[(3, )]8]0 acc×3 accaccacc空递归class Solution { public: string dfs(const string s,intindex){ string res; while(indexs.size()s[index]!]){ if(!isdigit(s[index])){ ress[index]; } else{ int num0; while(indexs.size()isdigit(s[index])){ numnum*10s[index]-0; } //[ index; string innerdfs(s,index); index; for (int i 0; i num; i) { res inner; } } } return res; } string decodeString(string s) { int index0; return dfs(s,index ); }