Palindrome Partitioning
DP + 回溯
vector<vector<string>> partition(string s) { // Note: The Solution object is instantiated only once and is reused by each test case. vector<vector<string>> res; if(s.empty()) return res; int n = s.size(); vector<vector<bool>> isPalin(n,vector<bool>(n,false)); int i,j; for(i=0;i<n;i++) isPalin[i][i] = true; for(i=0;i<n-1;i++) isPalin[i][i+1] = (s[i]==s[i+1]?true:false); for(int len=3;len<=n;len++) { for(int i=0;i<n-len+1;i++) { j = i+len-1; isPalin[i][j] = (s[i]==s[j]?isPalin[i+1][j-1]:false); } } vector<string> path; dfs(0,s,isPalin,path,res); return res; } void dfs(int pos,string& s,vector<vector<bool>>& isPalin,vector<string>& path,vector<vector<string>>& res) { if(pos==s.size()) { res.push_back(path); return; } for(int i=pos;i<s.size();i++) { if(isPalin[pos][i]) { path.push_back(s.substr(pos,i-pos+1)); dfs(i+1,s,isPalin,path,res); path.pop_back(); } } }