LeetCode 1278 分割回文串 III
本题是给出一个字符串,让你分割为k个回文串,问至少需要修改多少字符才能完成。这道题是典型的动态规划类题目,首先预处理出s[i]到s[i]的字符串如果修改成回文串需要修改多少字符,然后用一个数组dp[i][j]记录下标从0到i的字符组成的字符串分割为j个回文串最少需要修改多少字符。使用dp[i][t]=min(dp[i][t],dp[j][t-1]+need[j+1][i])来更新dp数组,详细可见代码。
class Solution {
public:
int need[105][105];
int dp[105][105];
void init(string s)
//求出s[i]到s[j]需要修改多少字符才能成为回文串
{
int sz=s.size();
for(int i=0;i<sz;i++)
for(int j=i+1;j<sz;j++)
{
int ans=0,cnt=0;
for(int k=i;k<=(j+i)/2;k++,cnt++)
if(s[k]!=s[j-cnt])
{
ans++;
}
need[i][j]=ans;
}
}
int palindromePartition(string s, int k) {
init(s);
int sz=s.size();
memset(dp,0x3f3f3f3f,sizeof(dp));
for(int i=0;i<=k;i++)
dp[i][i+1]=0;
for(int i=0;i<sz;i++)
{
dp[i][1]=need[0][i];
for(int j=0;j<i;j++)
{
for(int t=2;t<=k&&j+2>=t;t++)
{
dp[i][t]=min(dp[i][t],dp[j][t-1]+need[j+1][i]);
}
}
}
return dp[sz-1][k];
}
};