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"] ]
思路: 首先使用动态规划纪录从i到j是否是回文数;然后遍历字符串,对于flag[depth][i]有选择与不选择两种情况,所以使用带回溯的递归,回溯法注意在递归返回后要将递归前改动的内容复原。
class Solution { public: vector<vector<string>> partition(string s) { results.clear(); int sLength = s.length(); vector<vector<bool>> flag(sLength, vector<bool>(sLength,false)); //flag[i][j]纪录i到j是否是回文数 for (int i=0;i<sLength;i++) { for(int j=0;j<=i;j++) if(s[i]==s[j]&&(i-j<2||flag[j+1][i-1])) //动态规划状态转移方程 { flag[j][i]=true; } } vector<string> pre; dfs(s,flag,pre,0); return results; } void dfs(const string &s, vector<vector<bool>> &flag, vector<string> &pre, int depth) { if(depth>=s.length()) //结束条件:最后一个字符已遍历 { results.push_back(pre); return; } for(int i = depth; i<s.length(); i++) { if(flag[depth][i]) { pre.push_back(s.substr(depth, i-depth+1)); //遍历前将当前找到的回文数加入 dfs(s,flag,pre,i+1); pre.pop_back(); //回溯 } } } private: vector<vector<string>> results; };
131. Palindrome Partitioning (Recursion, DP)
原文:http://www.cnblogs.com/qionglouyuyu/p/4855296.html