131. Palindrome Partitioning

在这里插入图片描述

这道题目竟然做起来感觉有点困难,真是。。。
先是自己想了一个奇怪的写法:

class Solution {
public:
    vector<vector<string>> partition(string s) {
        if (s.empty())
            return vector<vector<string>>();
        int sz = s.size();
        vector<vector<bool>> dp(sz, vector<bool>(sz, false));
        for (int i = sz-1; i >= 0; --i)
            for (int j = i; j < sz; ++j) {
                if (s[i] == s[j] && (j - i <= 2 || dp[i+1][j-1]))
                    dp[i][j] = true;
            }
        map<pair<int, int>, vector<vector<string>>> m;
        return helper(s, 0, sz-1, dp, m);
    }
private:
    vector<vector<string>> helper(string& s, int beg, int end, vector<vector<bool>>& dp, map<pair<int, int>, vector<vector<string>>>& m) {
        if (beg > end)
            return vector<vector<string>>();
        auto key = make_pair(beg, end);
        if (m.find(key) != m.end())
            return m[key];
        vector<vector<string>> res;
        if (dp[beg][end])
            res.push_back(vector<string>{s.substr(beg, end-beg+1)});
        for (int i = end; i > beg; --i) {
            if (!dp[i][end])
                continue;
            string str = s.substr(i, end-i+1);
            auto left = helper(s, beg, i-1, dp, m);
            for (auto& vec : left) {
                vec.push_back(str);
                res.push_back(std::move(vec));
            }
        }
        return res;
    }
};

后来看了一眼评论区,才想起来应该的做法:

class Solution {
public:
    vector<vector<string>> partition(string s) {
        if (s.empty())
            return vector<vector<string>>();
        int sz = s.size();
        vector<vector<bool>> dp(sz, vector<bool>(sz, false));
        for (int i = sz-1; i >= 0; --i)
            for (int j = i; j < sz; ++j) {
                if (s[i] == s[j] && (j - i <= 2 || dp[i+1][j-1]))
                    dp[i][j] = true;
            }
        vector<vector<string>> res;
        vector<string> temp;
        dfs(s, 0, res, temp, dp);
        return res;
    }
private:
    void dfs(string& s, int idx, vector<vector<string>>& res, vector<string>& temp, vector<vector<bool>>& dp) {
        if (idx == s.size()) {
            res.push_back(temp);
            return;
        }
        for (int i = idx; i < s.size(); ++i) {
            if (!dp[idx][i])
                continue;
            temp.push_back(s.substr(idx, i-idx+1));
            dfs(s, i+1, res, temp, dp);
            temp.pop_back();
        }
    }    
};
posted @ 2019-10-10 11:27  于老师的父亲王老爷子  阅读(12)  评论(0)    收藏  举报