class Solution {
public:
string decodeString(string s) {
// pair 里存的是:<左括号前的倍数, 左括号前的字符串>
stack<pair<int, 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]]"
| 步骤 | 字符 | time | result | 栈 |
|---|---|---|---|---|
| 1 | '3' | 3 | "" | 空 |
| 2 | '[' | 0 | "" | [(3, "")] |
| 3 | 'a' | 0 | "a" | [(3, "")] |
| 4 | '2' | 2 | "a" | [(3, "")] |
| 5 | '[' | 0 | "" | [(3, ""), (2, "a")] |
| 6 | 'c' | 0 | "c" | [(3, ""), (2, "a")] |
| 7 | ']' | 0 | "a" + "c"×2 = "acc" | [(3, "")] |
| 8 | ']' | 0 | "" + "acc"×3 = "accaccacc" | 空 |
递归:
class Solution {
public:
string dfs(const string& s,int&index){
string res="";
while(index<s.size()&&s[index]!=']'){
if(!isdigit(s[index])){
res+=s[index++];
}
else{
int num=0;
while(index<s.size()&&isdigit(s[index++])){
num=num*10+s[index]-'0';
}
//[
index++;
string inner=dfs(s,index);
index++;
for (int i = 0; i < num; i++)
{
res += inner;
}
}
}
return res;
}
string decodeString(string s) {
int index=0;
return dfs(s,index );
}