当前位置: 首页 > 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.rkmt.cn/news/1437531.html

相关文章:

  • 机械臂角度识别 机械臂自由度识别 yolov8机械臂关键点检测模型部署+教程+代码+数据集+工业应用
  • 2026年汽车静电阻隔面料实测评测:四家企业横向对比 - 优质品牌商家
  • 书匠策AI:你的课程论文救急神器,用过的人都说“真香“
  • 别再死记硬背了!用C语言手写一个test_and_set(),彻底搞懂操作系统硬件锁
  • AMP算法实战:用Python从零实现压缩感知信号恢复(附完整代码与避坑指南)
  • 实战落地+数据可视化:6月最新重庆优质GEO优化服务商榜单深度测评 - 品牌官
  • 2026年苏州防水维修标杆机构专业市场分析与全场景渗漏治理选型适配指南 专业防水公司排名推荐(2026年5月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 集团首都公报:放飞炬人集团内政署批准起草《出口劳务法案》《劳务产能调整和AIQI技艺法案》
  • 【案例分享】我从失败中学到的架构教训
  • 2026年当下河北地区镶铜铸铁闸门采购指南:实力厂家深度解析 - 2026年企业资讯
  • 2026年当前秦皇岛婚礼酒店哪个好?深度解析秦皇岛万怡酒店婚宴实力 - 2026年企业资讯
  • 2026年q2四川无机涂料外墙厂家排行及选型推荐:无机涂料多少钱一平方/无机涂料工程专用/实力盘点 - 优质品牌商家
  • 2026年苏州本地专业防水补漏领域五家合规经营企业深度梳理与场景适配分析 专业防水公司排名推荐(2026年5月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 2026年苏州3家资质齐全防水补漏服务商核心市场适配与专业能力分析报告 专业防水公司排名推荐(2026年5月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 逐位二进制拼接 → 翻转 → 去头零 → 消邻重
  • 用Python和R实战检验皮尔逊相关性五大假设(附完整代码与可视化)
  • K-means实战避坑指南:如何用肘部法则和轮廓系数找到最佳K值(附Python代码)
  • HTML5 新特性概览:探索现代 Web 的强大能力
  • 从手动混乱到智能有序:Irony Mod Manager如何让Paradox游戏模组管理效率提升3倍?
  • VoxCPM 语音模型新手部署与调用全指南
  • QGIS新手避坑指南:从高德路网数据到空间分析的全流程实操
  • Django+Vue智慧农业管理系统源码+论文
  • 别再当‘黑盒’模型受害者了!用Python的shap库5分钟看懂你的XGBoost模型决策
  • 2026年国产质量流量计TOP5排行 核心参数实测对比 - 优质品牌商家
  • C51代码银行空间保留技术详解与实践
  • 2026年当下,河北铁艺护栏实力厂家如何实现高性价比? - 2026年企业资讯
  • 【Gemini印度语言工程白皮书】:从Devanagari脚本识别到低资源方言微调的5层技术栈
  • 2026年推荐网站设计实力公司,哪家性价比高? - myqiye
  • 2026年高评价硅酮胶实测评测:广东胶粘剂oem厂家/广东食品级硅酮胶/广东高温硅酮胶/性能与场景适配对比 - 优质品牌商家
  • 从生物学视角解析智能本质:AI与人类认知的鸿沟