解题步骤:
参考代码:
class Solution {
public:
int minCut(string s) {
int n=s.size();
//保存s的所有子串是否是回文串的信息的哈希表
vector<vector<bool>> hash(n,vector<bool>(n));
for(int i=n-1;i>=0;i--)
{
for(int j=i;j<n;j++)
{
if(s[i]==s[j])
{
hash[i][j]=i+1<j?hash[i+1][j-1]:true;
}
}
}
vector<int> dp(n,INT_MAX);
for(int i=0;i<n;i++)
{
//如果[0,i]子串本来就是回文串,那么就无需分割,即dp[i]=0
if(hash[0][i]==true)
{
dp[i]=0;
}
else
{
//[0,i]子串不是回文串就要找到一个j,令[j,i]子串是回文串,并且
//把[0,j-1]分割成回文串用最少的分割次数
for(int j=1;j<=i;j++)
{
if(hash[j][i]==true)
{
dp[i]=min(dp[i],dp[j-1]+1);
}
}
}
}
return dp[n-1];
}
};
你学会了吗???