394. Decode String

你快乐吗

Posted by bbkgl on December 19, 2019

金风玉露一相逢

便胜却人间无数

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;
    }
};