394. 字符串解码https://leetcode.cn/problems/decode-string/description/?envType=study-plan-v2&envId=top-100-liked递归地识别这个模式:数字[子模式]...;但注意,数字可能没有,当没有数字的时候中括号也没有,出现这种情况的时候直接将这部分加入结果中,然后继续识别上面的模式。
class Solution {
public:
string decodeString(string s) {
int idx = 0;
string res = "";
while (true) {
int repeat_time = 0;
// 先看数字是多少
while (s[idx] <= '9' && s[idx] >= '0') {
repeat_time *= 10;
repeat_time += s[idx] - '0';
idx ++;
}
if (repeat_time == 0) {
// 没有数字,直接加入结果中,然后重新开始
while (s[idx] <= 'z' && s[idx] >= 'a') {
res += s[idx];
idx ++;
}
if (idx >= s.size()) break;
continue;
}
// 有数字,则后面肯定是中括号,取出中括号内的东西然后递归求解
int left = 1;
idx ++;
int start = idx;
while (left) {
if (s[idx] == '[') left ++;
else if (s[idx] == ']') left --;
idx ++;
}
string sub = s.substr(start, idx - 1 - start);
sub = decodeString(sub);
for (int i=0; i < repeat_time; ++i) {
res += sub;
}
if (idx >= s.size()) break;
}
return res;
}
};