金风玉露一相逢
便胜却人间无数
C++,字符串处理、栈、dfs。
这种套娃题,肯定想到的就是递归了,为什么用递归?
因为套娃啊,在处理这个字符串的过程中,就会发现[...]
里的内容又是一个字符串,可以用相同的方法去处理,所以就是找到所有的[...]
,把...
扔给递归的下一层去处理。同时要把[...]
前的数字给提取出来,把下一层返回的结果,重复加N遍,N是前面提取到的数字。
重要的是,给每个[
配对,在找和配对的过程中,就能够把数字提取出来,把[...]
找出来扔给下一层。
配对的话,就是用一个cnt_
变量,如果碰到[
,就加1,碰到]
就减1,最后为0时,就找到与最开始[
配对的]
了。
简单吧!!!然后再想想,就能写出代码了:
class Solution {
public:
string decodeString(string s) {
string ans;
for (int i = 0; i < s.length(); i++) {
if (isdigit(s[i])) {
int j = i + 1;
while (s[j] != '[') j++;
int left = j + 1;
int cnt = atoi(s.substr(i, j - i).c_str());
int cnt_ = 1;
while (cnt_ > 0) {
j++;
if (s[j] == '[') cnt_++;
else if (s[j] == ']') cnt_--;
}
string str = decodeString(s.substr(left, j - left));
while (cnt--) ans += str;
i = j;
} else ans.push_back(s[i]);
}
return ans;
}
};