给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。 返回符合要求的 最少分割次数 。
#define MIN(a,b) ((a) < (b) ? (a) : (b))
int minCut(char * s){
int len = strlen(s);
int dp[len][len];
for(int i = 0; i < len; i++)
{
dp[i][i] = 1;
}
for(int i = len-2; i >= 0; i--) //找出回文字符串
{
for(int j = i+1; j < len; j++)
{
if(s[i] == s[j])
{
dp[i][j] = j-1 > i+1 ? dp[i+1][j-1] : 1;
}
else
{
dp[i][j] = 0;
}
}
}
int rec[len];
rec[0] = 0;
for(int i = 1; i < len; i++) //记录最少的分割次数
{
if(dp[0][i])
{
rec[i] = 0;
}
else
{
rec[i] = rec[i-1] + 1;
for(int j = 1; j < i; j++)
{
if(dp[j][i]) //加入从j到i为回文串就判断在rec[i]的分割次数少还是rec[j-1] +1 少
{
rec[i] = MIN(rec[i], rec[j-1] + 1); //找出在i个字符串中最少的分割次数
}
}
}
}
return rec[len-1];
}
思路:动态规划
可以先找出从i到j是否为回文字符串,然后不断遍历分割点,找出最少的分割次数