一、题目
二、代码
class Solution
{
public:
//dp[i]:范围是[0, i]的回文子串,最少分割次数是dp[i]。
//当 [j+1,i]为回文字串时
//dp[i] = min(dp[i], dp[j] + 1);
int minCut(string s)
{
int i,j;
vector<vector<bool>> is_Palindrome(s.size(),vector<bool>(s.size(),0));
for(i=s.size()-1;i>=0;i--) //判断是否为回文
{
for(j=0;j<s.size();j++)
{
if(s[i]==s[j]&&(j-i<=1||is_Palindrome[i+1][j-1]))
{
is_Palindrome[i][j]=1;
}
}
}
vector<int> dp(s.size(),0);
for(i=0;i<s.size();i++) dp[i]=i;
for(i=1;i<s.size();i++)
{
if(is_Palindrome[0][i]==1)
{
dp[i]=0;
continue;
}
for(j=0;j<i;j++) //横向拉长的覆盖
{
if(is_Palindrome[j+1][i])
{
dp[i]=min(dp[i],dp[j]+1);
}
}
}
return dp[s.size()-1];
}
};