1、题目
https://leetcode-cn.com/problems/palindrome-partitioning/submissions/
2、题意
题解1:爆搜+特判
class Solution {
public:
vector<vector<string>> res;
vector<string> t;
void dfs(string &s,int cnt)
{
if(cnt==s.size())
{
res.push_back(t);
return ;
}
string temp = "";
for(int i=cnt;i<s.size();i++)
{
temp+=s[i];
bool flag = true;
int l=0,r = temp.size()-1;
while(l<r)
{
if(temp[l++]!=temp[r--])
flag = false;
}
if(flag)
{
t.push_back(temp);
dfs(s,i+1);
t.pop_back();
}
}
}
vector<vector<string>> partition(string s) {
dfs(s,0);
return res;
}
};
题解2:预处理一个f[i][j]数组 表示i-j是否是回文串;
class Solution {
public:
vector<vector<string>> res;
vector<string> t;
vector<vector<bool>> f;
void dfs(string &s,int cnt)
{
if(cnt==s.size())
{
res.push_back(t);
return ;
}
for(int i=cnt;i<s.size();i++)
{
if(f[cnt][i])
{
t.push_back(s.substr(cnt,i-cnt+1));
dfs(s,i+1);
t.pop_back();
}
}
}
vector<vector<string>> partition(string s) {
int n = s.size();
f = vector<vector<bool>> (n,vector<bool>(n,false));
for(int j=0;j<n;j++)
{ for(int i=0;i<=j;i++)
{
if(i==j)//长度为1
f[i][j] = true;
else if(s[i]==s[j])
{
if(j-i==1)//长度为2;
f[i][j] = true;
else
f[i][j] = f[i+1][j-1];
}
}
}
dfs(s,0);
return res;
}
};