zoukankan      html  css  js  c++  java
  • 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];
        }
    };
    
  • 相关阅读:
    SDN第二次上机作业
    全面而清晰的网络流
    source命令详解
    C++ 优先队列存放自定义类型的指针时自定义优先级失效的解决方法
    find命令查找文件和文件夹
    OOAD
    NULL与nullptr
    Segment fault 常见原因
    虚函数的用法
    使用gdb调试段错误
  • 原文地址:https://www.cnblogs.com/ambition-hhn/p/12831069.html
Copyright © 2011-2022 走看看