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_; };
Passion, patience, perseverance, keep it and move on.

浙公网安备 33010602011771号