Palindrome Partitioning

Q:

Given a string s, partition s such that every substring of the partition is a palindrome.

Return all possible palindrome partitioning of s.

For example, given s = "aab",
Return

  [
    ["aa","b"],
    ["a","a","b"]
  ]

A:

对于字符串A,A[i]代表从0到i的子字符串的回文子串集合,A[i]依赖于A[0]....A[i - 1],所以求A[i]时保存了之前的所有结果,这样空间利用率会比较挫,但是如果用dp,会有大量的重复计算,另外一点是可以先保存下所有的子字符串是否为回文,O(n^2)时间复杂度。

class Solution {
public:
    vector<vector<string> > partition(string s) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        Prepare(s);
        return partitionInteral(s);
    }
private:
    vector<vector<string> > partitionInteral(const string& s) {
        vector<vector<string> > results;
        if (s.empty()) return results;
        int len = s.length();
        sub_pals_.resize(len);
        vector<vector<string> >& org_pals = sub_pals_[0];
        org_pals.push_back(vector<string>());
        org_pals[0].push_back(s.substr(0,1));
        for (int i = 1; i < len; ++i) {
            vector<vector<string> >& cur_pals = sub_pals_[i];
            if (is_pal_[0][i]) {
                cur_pals.push_back(vector<string>());
                cur_pals.back().push_back(s.substr(0, i + 1));
            }
            for (int j = 1; j <= i; ++j) {
                if (!is_pal_[j][i]) continue;
                for (int k = 0; k < sub_pals_[j - 1].size(); ++k) {
                    cur_pals.push_back(vector<string>());
                    vector<string>& tmp = cur_pals.back();
                    tmp.insert(tmp.end(), sub_pals_[j - 1][k].begin(), sub_pals_[j - 1][k].end());
                    tmp.push_back(s.substr(j, i - j + 1));
                }
            }
        }
        return sub_pals_.back();
    }
    
    void Prepare(const string& s) {
        sub_pals_.clear();
        is_pal_.clear();
        if (s.empty()) return;
        int len = s.length();
        is_pal_.resize(len, vector<bool>());
        for (int i = 0; i < len; ++i) {
            is_pal_[i].resize(len, false);
        }
        for (int i = 0; i < len; ++i) is_pal_[i][i] = true;
        for (int i = len - 2; i >= 0; --i) {
            is_pal_[i][i + 1] = (s[i] == s[i + 1]);
            for (int j = i + 2; j < len; ++j) {
                is_pal_[i][j] = (s[i] == s[j] && is_pal_[i + 1][j - 1]);
            }
        }
    }
    
    vector<vector<vector<string> > > sub_pals_;
    vector<vector<bool> > is_pal_;
};

 

posted @ 2013-07-06 20:49  dmthinker  阅读(125)  评论(0)    收藏  举报