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"] ]
链接:https://leetcode.com/problems/palindrome-partitioning/description/
题解:跟上篇dp一样只是这里求所有方法,我的方法比较暴力主要在空间上,用map标记前i个字符串的方法表,只要求出这个表即可,答案方法用回溯,代码比较简洁,也就是利用tmp来加入当前递归栈中的分出的回文串,ans来表示递归到n的结果,st表示当前索引,所以用递归时遍历st到n,只要st到i是回文加入tmp中然后dfs一下i+1到n,然后递归出来后把tmp弹出来
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<string> tmp;
vector<vector<string>> ans;
dfs(s,0,tmp,ans);
return ans;
}
private:
void dfs(string s,int st,vector<string>& tmp,vector<vector<string>>& ans){
int n=s.size();
if(st==n){
ans.push_back(tmp);
}else{
for(int i=st;i<n;i++){
if(isPa(s,st,i)){
tmp.push_back(s.substr(st,i-st+1));
dfs(s,i+1,tmp,ans);
tmp.pop_back();
}
}
}
}
bool isPa(string s,int l,int r){
while(l<r)
{
if(s[l++]!=s[r--]) return false;
}
return true;
}
};
我的方法:
class Solution {
public:
vector<vector<string>> partition(string s) {
int n = s.size();
vector<vector<string>> ans;
vector<vector<bool>> pa(n,vector<bool>(n,false));
map<int,vector<vector<string>>> mp;
for(int i=0;i<n;i++){
vector<vector<string>> res;
for(int j=0;j<=i;j++){
string str=s.substr(j,i-j+1);
if(s[j]==s[i]&&(i-j<2||pa[j+1][i-1])){
pa[j][i]=true;
if(j==0){
vector<string> ss;ss.push_back(str);
res.push_back(ss);
}else{
vector<vector<string>> tmp=mp[j-1];
for(vector<string> ss:tmp){
ss.push_back(str);
res.push_back(ss);
}
}
}
}
mp[i]=res;
}
return mp[n-1];
}
};