题目链接
class Solution {
public:
int minCut(string s) {
//先预处理出s的每个子串是否为回文字符串
int n=s.size();
vector<vector<bool> > f(n,vector<bool>(n,true));
for(int i=n-1;i>=0;i--){
for(int j=i+1;j<n;j++){
f[i][j] = f[i+1][j-1] && s[i]==s[j];
}
}
int dp[n];//dp[i]表示子串s[0...i]切割为回文的最小切割次数,它可由s[0...j]+1转移过来,其中s[j+1....i]是回文字符串
memset(dp,0x3f,sizeof(dp));
//如果s[0...i]本身就是回文字符串,则次数为0
for(int i=0;i<n;i++){
if(f[0][i]){
dp[i]=0;//本身就是回文字符串必须特判
}else{
for(int j=0;j<i;j++){
if(f[j+1][i]){
dp[i]=min(dp[i],dp[j]+1);
}
}
}
}
return dp[n-1];
}
};