Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
Example:
Input: "aab" Output: [ ["aa","b"], ["a","a","b"] ]
/* 返回所有划分为回文数可能的结果
* 问题拆分1. 判断s[i:j] 是否为回文数 j-i<=2 时即 aa aba a这种情况
* 2. 递归回溯 记录结果
* */
class Solution {
public:
vector<vector<string>> partition(string s) {
int slen = s.length();
vector<vector<bool>> dp(slen, vector<bool>(slen, false));
dp[0][0] = true;
for(int j=0;j<slen;j++){
for(int i=0;i<=j;i++){// j-i <=2 本应该单独写在初始化中 这里写在了一起。
if(s[i] == s[j] && (j-i<=2 || dp[i+1][j-1])){
dp[i][j] = true;
}
}
}
vector<vector<string>> ret;
vector<string> tmpout;
mysolu(s, 0, ret, tmpout, dp);
return ret;
}
void mysolu(const string &s, int start, vector<vector<string>> &ret,
vector<string> &tmpout, vector<vector<bool>> &dp){
if(start == s.length()) ret.push_back(tmpout);
else{
for(int i=start;i<s.length();i++){// 从start开始可以保留单个元素的情形
if(dp[start][i]){
tmpout.push_back(s.substr(start, i-start+1));
mysolu(s, i+1, ret, tmpout, dp);
tmpout.pop_back();
}
}
}
}
};