当前位置: 首页 > news >正文

Kimi LeetCode 2911. 得到 K 个半回文串的最少修改次数 Java实现

这是 LeetCode 2911「得到 K 个半回文串的最少修改次数」的 Java 实现。

核心思路

这道题分为两个部分:

  1. 预处理cost[i][j]:计算将子串s[i..j]变成半回文串的最小修改次数
  2. 动态规划:将字符串分成 k 段,使总修改次数最少

半回文串的定义

一个长度为len的字符串是半回文串,当且仅当存在1 <= d < lenlen % d == 0,使得将字符串按模d分成d个组后,每个组都是回文串。

例如"adbgad"d=2时分成两组:"abg"(下标 0,2,4)和"dad"(下标 1,3,5),两组都是回文串。

优化点

  • 预处理每个长度的所有因子,避免重复计算
  • getCostD方法按偏移量offset(0 到 d-1)分别检查每组回文需要的修改次数

Java 代码

classSolution{publicintminimumChanges(Strings,intk){finalintn=s.length();// factors[i] := i 的所有真因子 (1 <= d < i 且 i % d == 0)List<Integer>[]factors=getFactors(n);// cost[i][j] := 将 s[i..j] 变成半回文串的最小修改次数int[][]cost=getCost(s,n,factors);// dp[i][j] := 将 s[i:] 分成 j 个半回文子串的最小修改次数// 这里采用从右往左的 DP,也可以改成从左往右int[][]dp=newint[n+1][k+1];for(int[]row:dp){Arrays.fill(row,n);// 用 n 作为无穷大(最大修改次数不会超过 n)}dp[n][0]=0;// 空串分成 0 段,修改次数为 0for(inti=n-1;i>=0;--i){for(intj=1;j<=k;++j){// 枚举下一段的结束位置 lfor(intl=i+1;l<n;++l){dp[i][j]=Math.min(dp[i][j],dp[l+1][j-1]+cost[i][l]);}}}returndp[0][k];}// 预处理 1~n 每个数的真因子privateList<Integer>[]getFactors(intn){List<Integer>[]factors=newList[n+1];for(inti=1;i<=n;++i){factors[i]=newArrayList<>();factors[i].add(1);// 1 是所有数的因子}for(intd=2;d<n;++d){for(inti=d*2;i<=n;i+=d){factors[i].add(d);}}returnfactors;}// 计算所有子串变成半回文串的最小代价privateint[][]getCost(finalStrings,intn,List<Integer>[]factors){int[][]cost=newint[n][n];for(inti=0;i<n;++i){for(intj=i+1;j<n;++j){// 长度至少为 2 才能是半回文finalintlength=j-i+1;intminCost=length;// 最大不会超过长度for(finalintd:factors[length]){minCost=Math.min(minCost,getCostD(s,i,j,d));}cost[i][j]=minCost;}}returncost;}// 计算将 s[i..j] 按周期 d 变成半回文串的修改次数// 按模 d 的余数分成 d 个组,每组需要是回文串privateintgetCostD(finalStrings,inti,intj,intd){intcost=0;// 对每个偏移量 offset (0 到 d-1),检查对应的组for(intoffset=0;offset<d;++offset){intl=i+offset;// 组的左端点intr=j-d+1+offset;// 组的右端点// 在该组内,以 d 为步长向中间靠拢,检查回文while(l<r){if(s.charAt(l)!=s.charAt(r)){++cost;}l+=d;r-=d;}}returncost;}}

复杂度分析

项目 复杂度
时间O(n³)— 预处理O(n³)(枚举子串O(n²)× 枚举因子和检查O(n)),DP 部分O(n²k)
空间O(n²)cost数组O(n²)dp数组O(nk),因子数组O(n log n)

由于题目限制n <= 200O(n³)的算法完全可以通过。

http://www.cnnetsun.cn/news/2680444.html

相关文章:

  • C51代码银行空间保留技术详解与实践
  • 系统架构设计师-基于架构的软件开发方法(ABSD)核心原理
  • 【统计法规】3.6服务人民原则 ★ ★ ★
  • 光量子计算技术手册 离散变量与连续变量深度解析
  • 深入紫光PGL22G的DDR3控制器:从AXI4接口到实际读写测试的完整流程解析
  • 【独家首发】Google内部Gemini广告创意SOP文档(2024Q3最新版,仅限本文解密)
  • 微信QQ防撤回终极指南:3分钟永久保存重要消息
  • 后端技术栈的安全考量:构建安全可靠的后端系统
  • 九大网盘直链解析工具终极使用指南:告别下载限速的简单方法
  • XML 应用程序
  • Excel批量查询终极指南:如何用QueryExcel一键搞定多文件数据搜索
  • 如何用抖音批量下载工具轻松收集无水印视频:完整指南
  • 告别串口!用MobaXterm和一根网线,5分钟建立树莓派SSH调试环境
  • Gemini vs GPT-4o vs Claude 3.5:217项基准测试数据对比,谁才是真正生产力引擎?
  • 紧急!Gemini监测延迟超117秒?这6个服务器级配置正在 silently 拖垮你的响应时效
  • 以镜续迹、以智御防|全域跨镜追踪构建主动安全防控体系
  • 这份榜单够用!2026年必备AI论文软件榜单,毕业论文免费写还合规
  • 健康 检查
  • 神经渲染“多尺度表示”全解析:从原理到国产化落地
  • 【非营利组织紧急通告】:Gemini捐赠活动策划窗口期仅剩17天——错过本轮算法适配将损失43%潜在捐赠额
  • Gemini风控模型准确率提升47%:从数据漂移到实时反馈的5步调优闭环
  • Node.js 事件循环
  • Python 3 OS模块详解
  • 如何用Gemini写出爆款文案:3步精准锚定用户意图、5秒激发阅读冲动
  • AI Agent Harness Engineering 创业赛道分析:3个高潜力商业模式与落地切入点
  • 缠论可视化插件:3分钟让复杂K线结构一目了然的智能分析工具终极指南
  • Gemini公益项目实施全链路拆解:从资质审核到API对接,72小时上线实操手册
  • 【图像融合】基于matlab域变换滤波和稀疏表示的红外与可见光图像融合【含Matlab源码 15582期】含报告
  • 40_AI短片实战第十三弹:AIGC甩尾、摔落与落地咆哮——首尾帧连贯动作生成
  • 微信聊天记录永久保存终极指南:5步轻松备份你的珍贵记忆