首页 > 其他分享 >得到 K 个半回文串的最少修改次数

得到 K 个半回文串的最少修改次数

时间:2023-10-22 17:15:05浏览次数:27  
标签:修改 int 次数 最少 字符串 size 回文

给你一个字符串 s 和一个整数 k ,请你将 s 分成 k 个 子字符串 ,使得每个子字符串变成半回文串需要修改的字符数目最少。
请你返回一个整数,表示需要修改的最少字符数目。

1. 动态规划

class Solution {
public:
    int minimumChanges(string s, int k) {
        int n = s.size();
        //计算字符串转化为半回文串最小修改次数
        function<int(string)> get = [&](string str){
            int n = str.size();
            int res = INT_MAX;
            for(int d=1;d<=n/2;d++){
                if(n%d!=0) continue;
                int cnt = 0;
                for(int i=0;i<d;i++){//不同的起始位置
                    string cur = "";
                    for(int j=i;j<n;j=j+d)
                        cur.push_back(str[j]);
                    for(int j=0;j<cur.size()/2;j++)
                        cnt += (cur[j]!=cur[cur.size()-j-1]);
                }
                res = min(res,cnt);
            }
            return res;
        };
        //预先计算任意子串最小修改次数
        int modify[n][n];
        memset(modify,INT_MAX,sizeof(modify));//计算任意子串最小修改次数
        for(int i=0;i<n;i++)
            for(int j=i+1;j<n;j++)
                modify[i][j] = get(s.substr(i,j-i+1));
                
        //动态规划,dp[i][j]表示以i位置作为第j段结尾的最小修改次数
        int dp[n+1][k+1];
        memset(dp,100,sizeof(dp));
        dp[0][0] = 0;
 
        for(int i=1;i<=n;i++){//遍历每一个位置
            for(int j=1;j<=k;j++){//遍历每一个段
                for(int l=1;l<i;l++){//l-i作为当前段
                    if(modify[l-1][i-1]==INT_MAX) continue;
                    dp[i][j] = min(dp[i][j],dp[l-1][j-1]+modify[l-1][i-1]);
                }
            }
        }
        return dp[n][k];
    }
};

标签:修改,int,次数,最少,字符串,size,回文
From: https://www.cnblogs.com/929code/p/17780681.html

相关文章

  • 找到s字符串中的回文子串
    #coding=utf-8#找到s字符串中的回文子串s="abbc"#n=len(s)#result=''#foriinrange(n):##print(i)#forjinrange(i,n):##print(j)#k=s[i:j+1]##print(k)##print(k[::-1])#ifk==k......
  • 有向图转强连通图最少加边数
    原文链接问题描述对于一有向图,若需要保证任选一点即可走到其它所有点,询问最少需要加多少条有向边结论对于一有向图,若其对应DAG中入度为0的点数为$p$,出度为0的点数为$q$,则答案数为$max(p,q)$证明:$p\leqq$和$p\geqq$的证明过程类似,这里仅说明$p\leqq$的证明过程当$......
  • 给定字符串str= "asdfasdweraasdfasdf", 请python统计每个字符出现的次数,并将结果进行
    str="asdfasdweraasdfasdf"char_count={}forcharinstr:ifcharinchar_count:char_count[char]+=1else:char_count[char]=1forchar,countinchar_count.items():print(f"字符'{......
  • #yyds干货盘点# LeetCode程序员面试金典:最小操作次数使数组元素相等
    1.简述:给你一个长度为 n 的整数数组,每次操作将会使 n-1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。 示例1:输入:nums=[1,2,3]输出:3解释:只需要3次操作(注意每次操作会增加两个元素的值):[1,2,3]=>[2,3,3]=>[3,4,3]=>[4,4,4]示例2:输入:nums=[1......
  • 9. 回文数
    1.题目介绍给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121是回文,而123不是。示例1:输入:x=121输出:true示例2:输入:x=-121输出:false解释:从左向右读,为-121。从右向左读,为1......
  • 手把手教你分析IIS日志——IP访问次数,URI访问统计等
    配置IIS网站的日志下载日志分析工具https://gitee.com/tangdd369098655/open-network-disk解压打开选择文件指定分析规则(还可以自己写规则哦~~)运行规则进行分析今天就写到这里啦~小伙伴们,( ̄ω ̄( ̄ω ̄〃( ̄ω ̄〃)ゝ我们明天再见啦~~大家要天天开心哦欢迎大家指出文章需......
  • #yyds干货盘点# LeetCode程序员面试金典:用最少数量的箭引爆气球
    1.简述:有一些球形气球贴在一堵用XY平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i]=[xstart,xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切y坐标。一支弓箭可以沿着x轴从不同点 完全垂直 地射出。在坐标 x 处射出一......
  • 回文字串
    描述   给定一个字符串,输出所有长度至少为2的回文子串。   回文子串即从左往右输出和从右往左输出结果是一样的字符串,   比如:abba,cccdeedccc都是回文字符串。输入   一个字符串,由字母或数字组成。长度500以内。输出   输出所有的回文子串,每个子串一行。   ......
  • linux 中给文本按照指定列标记重复次数
     001、[root@pc1test2]#lsa.txt[root@pc1test2]#cata.txt##测试数据abbabcffba[root@pc1test2]#awk'{ay[$0]++;printay[$0],$0}'a.txt##按照列标记重复次数1a1b2b2a3b1c1f2f4b3a 。 ......
  • 【前端开发】免费统计个人网站、网页访问次数、访问设备、访问人地点等数据教程
    前言:在该网站选择小组件样式、生成代码后插入到自己的网页即可网站地址:https://whos.amung.us/第一步:选择小组件样式,并生成代码 第二步:将代码插入网页 第三步:网页中会出现统计次数小组件,点击小组件会跳转到统计详情页 最后,统计详情页会看到统计到的次数、地域、设备等......