Palindrome Partitioning
深搜一:
class Solution {
public:
vector<vector<string> > partition(string s) {
vector<vector<string> > result;
vector<string> path;
dfs(s,result,path,0,1);
return result;
}
//s[0..i-1]已经处理;考虑s[j-1]和s[j]之间是否断开。
void dfs(string &s,vector<vector<string> > &result,vector<string> &path,int i,int j)
{
if(j==s.size())
{
if(isPalindrome(s,i,j-1))
{
path.push_back(s.substr(i,j-i));
result.push_back(path);
path.pop_back();
}
return;
}
dfs(s,result,path,i,j+1);
if(isPalindrome(s,i,j-1))
{
path.push_back(s.substr(i,j-i));
dfs(s,result,path,j,j+1);
path.pop_back();
}
}
bool isPalindrome(string &s,int i,int j)
{
while(i<j&&s[i]==s[j])
{
++i;
--j;
}
return i>=j;
}
};
深搜二:
class Solution {
public:
vector<vector<string> > partition(string s) {
vector<vector<string> > result;
vector<string> path;
dfs(s,result,path,0);
return result;
}
//考虑以s[i]开头的划分方案。
void dfs(string &s,vector<vector<string> > &result,vector<string> &path,int i)
{
if(i==s.size())
{
result.push_back(path);
return;
}
for(int j=i;j<s.size();++j)
{
if(isPalindrome(s,i,j))
{
path.push_back(s.substr(i,j-i+1));
dfs(s,result,path,j+1);
path.pop_back();
}
}
}
bool isPalindrome(string &s,int i,int j)
{
while(i<j&&s[i]==s[j])
{
++i;
--j;
}
return i>=j;
}
};
动规一:
class Solution {
public:
vector<vector<string> > partition(string s) {
int n=s.size();
vector<vector<bool> > f(n,vector<bool>(n,false));
for(int j=0;j<n;++j)
{
for(int i=j;i>=0;--i)f[i][j]=(s[i]==s[j]&&((j-i<2)||f[i+1][j-1]));
}
//subPalindrome[j]表示s[0..j]的划分。
vector<vector<vector<string> > > subPalindrome(n);
for(int j=0;j<n;++j)
{
for(int i=j;i>=0;--i)
{
if(f[i][j])
{
string t=s.substr(i,j-i+1);
if(i-1>=0)
{
for(auto v : subPalindrome[i-1])
{
v.push_back(t);
subPalindrome[j].push_back(v);
}
}
else subPalindrome[j].push_back(vector<string>{t});
}
}
}
return subPalindrome[n-1];
}
};
动规二:
class Solution {
public:
vector<vector<string> > partition(string s) {
int n=s.size();
vector<vector<bool> > f(n,vector<bool>(n,false));
for(int i=n-1;i>=0;--i)
{
for(int j=i;j<n;++j)f[i][j]=(s[i]==s[j]&&((j-i<2)||f[i+1][j-1]));
}
//subPalindrome[i]表示s[i..n]的划分。
vector<vector<vector<string> > > subPalindrome(n);
for(int i=n-1;i>=0;--i)
{
for(int j=i;j<n;++j)
{
if(f[i][j])
{
string t=s.substr(i,j-i+1);
if(j+1<n)
{
for(auto v : subPalindrome[j+1])
{
v.insert(v.begin(),t);
subPalindrome[i].push_back(v);
}
}
else subPalindrome[i].push_back(vector<string>{t});
}
}
}
return subPalindrome[0];
}
};
Palindrome Partitioning II
动规一:
class Solution {
public:
int minCut(string s) {
int n=s.size();
//f[j]表示s[0..j]的最小划分数。
vector<int> f(n);
for(int j=0;j<n;++j)f[j]=j;
vector<vector<bool> > g(n,vector<bool>(n,false));
for(int j=0;j<n;++j)
{
for(int i=j;i>=0;--i)
{
if(s[i]==s[j]&&((j-i<2)||g[i+1][j-1]))
{
g[i][j]=true;
f[j]=min(f[j],(i-1>=0?f[i-1]:-1)+1);
}
}
}
return f[n-1];
}
};
动规二:
class Solution {
public:
int minCut(string s) {
int n=s.size();
//f[i]表示s[i..n-1]的最小划分数。
vector<int> f(n);
for(int i=0;i<n;++i)f[i]=n-1-i;
vector<vector<bool> > g(n,vector<bool>(n,false));
for(int i=n-1;i>=0;--i)
{
for(int j=i;j<n;++j)
{
if(s[i]==s[j]&&((j-i<2)||g[i+1][j-1]))
{
g[i][j]=true;
f[i]=min(f[i],(j+1<n?f[j+1]:-1)+1);
}
}
}
return f[0];
}
};