当前位置: 首页 > 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.jsqmd.com/news/926199/

相关文章:

  • 机械臂角度识别 机械臂自由度识别 yolov8机械臂关键点检测模型部署+教程+代码+数据集+工业应用
  • 量子计算冗余架构:双星设计提升容错与并行能力
  • 避坑指南:在Ubuntu 20.04上从零搭建XTDrone仿真环境(附解决MAVROS连接失败)
  • 数据结构 算法解释,排序、查找
  • 【元器件专题】MOS管内部结构
  • LEGO框架:空间加速器设计的动态数据流优化
  • 2026年Q2炉渣钢渣供应商评测:上阳建材适配性分析 - 优质品牌商家
  • 2026年汽车静电阻隔面料实测评测:四家企业横向对比 - 优质品牌商家
  • 阿里云旗舰级顶级代理商|年销4亿+官方可查,直享7折,稳靠不跑-路
  • 主流人工智能模型与工具开发商概览
  • 别再死记硬背了!用C语言手写一个test_and_set(),彻底搞懂操作系统硬件锁
  • 书匠策AI:你的课程论文救急神器,用过的人都说“真香“
  • 乐高wedo《套圈游戏》
  • AMP算法实战:用Python从零实现压缩感知信号恢复(附完整代码与避坑指南)
  • 实战落地+数据可视化:6月最新重庆优质GEO优化服务商榜单深度测评 - 品牌官
  • Codex+Vscode+Remote ssh+ 服务器自定义第三方API配置保姆级教程
  • 2026年苏州防水维修标杆机构专业市场分析与全场景渗漏治理选型适配指南 专业防水公司排名推荐(2026年5月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 最新Python爬虫实战(多线程爬虫篇)——案例26:多线程爬取斗罗大陆3龙王传说小说批量保存到txt(附上完整爬虫代码)
  • 深度学习焊接缝识别 yolov8焊接缝缺陷分割代码+web部署
  • 2026年5月秦皇岛酒店之选:为何万怡酒店脱颖而出 - 2026年企业资讯
  • 基于MATLAB的simulink汽车防抱死仿真模型,汽车制动防抱死模型ABS仿真模型
  • 集团首都公报:放飞炬人集团内政署批准起草《出口劳务法案》《劳务产能调整和AIQI技艺法案》
  • 2026年5月国内静电压合面料主流供应商排行盘点:硅胶静电吸附遮阳帘专用皮革/耐高温静电吸附硅胶革/排行一览 - 优质品牌商家
  • RTOS学习笔记,二、多任务管理
  • 【案例分享】我从失败中学到的架构教训
  • 值得学习的嵌入式开发材料
  • 2026年当下河北地区镶铜铸铁闸门采购指南:实力厂家深度解析 - 2026年企业资讯
  • 2026年当前秦皇岛婚礼酒店哪个好?深度解析秦皇岛万怡酒店婚宴实力 - 2026年企业资讯
  • 助睿实验平台-浏览器用户行为分析与流失预测-数据加工
  • 2026年q2四川无机涂料外墙厂家排行及选型推荐:无机涂料多少钱一平方/无机涂料工程专用/实力盘点 - 优质品牌商家