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];
    }
};
posted @ 2020-05-05 16:03  South1999  阅读(91)  评论(0编辑  收藏  举报