【leetcode132】分割回文串
https://leetcode-cn.com/problems/palindrome-partitioning-ii/submissions/
分析
考虑dp[i]表示从开头到下标i为止的字符串的最小分割次数,字符串初始下标为1,转移方程为dp[i]=min(dp[j-1])+1,其中1<=j<=i,且满足s从j到i(闭区间)为回文串。dp[0]设置为-1。dfs判断回文串。
class Solution {
public:
int f[2010][2010]={0},dp[2010]={-1};
char s[2010]={0};
int dfs(int l,int r)
{
if(f[l][r]!=-1)return f[l][r];
if(l==r){f[l][r]=1;return 1;}
if(l==r-1)
{
if(s[l]==s[r]){f[l][r]=1;return 1;}
else {f[l][r]=0;return 0;}
}
if(s[l]==s[r])
{
f[l][r]=dfs(l+1,r-1);
return f[l][r];
}
f[l][r]=0;
return 0;
}
int minCut(string s1) {
int ls=s1.length();
for(int i=0;i<ls;i++)
{
s[i+1]=s1[i];
}
for(int i=1;i<=ls;i++)
{
for(int j=1;j<=ls;j++)
{
f[i][j]=-1;
}
}
for(int i=1;i<=ls;i++)
{
for(int j=i;j<=ls;j++)
{
dfs(i,j);
}
}
for(int i=2;i<=ls;i++)
{
int minn=2001;
for(int j=1;j<=i;j++)
{
if(f[j][i]&&minn>dp[j-1])minn=dp[j-1];
}
dp[i]=minn+1;
}
return dp[ls];
}
};