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

A.每日一题——2976. 转换字符串的最小成本 I

题目链接:2976. 转换字符串的最小成本 I(中等)

算法原理:

解法:图论 + Floyd-Warshall(弗洛伊德)

13ms击败91.30%

时间复杂度O(n+m+∣Σ∣³),其中 n 为 source 的长度,m 为 cost 的长度,∣Σ∣ 为字符集合的大小,本题中字符均为小写字母,所以 ∣Σ∣=26

核心思想:字符转换问题转化为「多源最短路径问题」

①把 26 个小写字母视为图的 26 个节点
②字符 A 转字符 B 的成本视为节点 A 到 B 的有向边权重
③求 “source 转 target 的最小总成本” 等价于 “依次求每个对应字符对的最短路径,再累加”

具体步骤:

1.问题建模
①定义 26×26 的距离矩阵dis,dis[i][j]表示字符'a'+i转换为'a'+j的最小成本
②矩阵初始化:dis[i][i] = 0,自身转自身成本为 0,其余值设为极大值INF,表示初始不可达
2.填充直接转换成本
①遍历original、changed、cost数组,将字符转换为对应索引(c-'a')
②若存在字符x转y的直接成本,为处理重复转化的情况,更新dis[x][y]为 “当前值” 和 “给定成本” 的最小值
3.Floyd-Warshall 求全源最短路径
①三层循环(中间节点 k → 源节点 i → 目标节点 j),核心公式:
②dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j])
③剪枝优化:若i 到 k 不可达:dis[i][k] = INF,则直接跳过
4.计算总转换成本
①遍历source和target的每个对应字符,取其索引s和t
②若该字符转换不可达:dis[s][t] = INF,直接返回 - 1
③否则累加dis[s][t],最终返回累加结果(用 long 类型避免 int 溢出)

Java代码:

class Solution { public long minimumCost(String source, String target, char[] original, char[] changed, int[] cost) { //定义为最大值的一半,防止后续相加溢出 final int INF=0x3f3f3f3f; //dis[i][j]:i处字符转化为j处字符的最小成本 int[][] dis=new int[26][26]; //初始化为INF,表示初始不可达 for(int i=0;i<26;i++){ Arrays.fill(dis[i],INF); dis[i][i]=0;//字符自身转为自身,成本为0 } //填充直接转换的成本 for(int i=0;i<cost.length;i++){ //将对应字符转化为索引 int x=original[i]-'a'; int y=changed[i]-'a'; //取最小值:遇到相同的转换,保留最小值 dis[x][y]=Math.min(dis[x][y],cost[i]); } //求任意两个字符间的最短路i->k->j //i:源字符,k:中间转换字符,j:目标字符 for(int k=0;k<26;k++){ for(int i=0;i<26;i++){ //剪枝优化,若i->k不可达,无需计算i->k->j的路径 if(dis[i][k]==INF) continue; for(int j=0;j<26;j++) dis[i][j]=Math.min(dis[i][j],dis[i][k]+dis[k][j]); } } //计算source转target的总最小成本,用long避免int溢出 long ret=0; for(int i=0;i<source.length();i++){ //取出索引 int s=source.charAt(i)-'a'; int t=target.charAt(i)-'a'; //若当前字符转换不可达,直接返回-1 if(dis[s][t]==INF) return -1; ret+=dis[s][t]; } return ret; } }
http://www.jsqmd.com/news/318913/

相关文章:

  • Pandas实战技巧,大数据新手入门必学
  • 高通SEE架构深度解析(3): 核心组件从功能模块到安全体系
  • IPD课程系列-产品平台和CCB
  • ollama 调用vlm模型 显存可以省到只用5g左右
  • 高通SEE架构深度解析(2): Sensor HAL层代码实战与ADSP通信
  • 把数字翻译成英文,其实是在考你“结构化思维”
  • python护工预约评价系统管理小程序
  • C++中的职责链模式实战
  • Python多线程与多进程:如何选择?(GIL全局解释器锁详解)
  • 智能标注平台开发:AI应用架构师的必备技能
  • 趣味项目与综合实战
  • 高通SEE架构深度解析(1): 架构原理与核心组件
  • python快递校园帮互助微信小程序设计与实现
  • C++网络编程(Boost.Asio)
  • 摸鱼软件系列:隐藏软件为了方便上班时摸鱼打开某些软件时怕被发现又不想关闭
  • python快餐店微信扫码点餐订餐小程序
  • 构建SpringBoot项目Docker镜像并发布到k8s集群中进行运行
  • 2026年政务服务智能化演进:从被动咨询到“端侧”业务闭环
  • python关于英雄联盟云顶之弈的游戏攻略视频辅助微信小程序
  • python基于小程序的临沂大学非机电动车车辆充电维修管理系统
  • 按照片拍摄日期批量重命名({年}{月}{日}{时}{分}{秒}_{文件名}_{时间戳})工具
  • 全面应用掌握!提示工程架构师带你全面掌握Agentic AI国际化应用技能
  • 使用Python进行PDF文件的处理与操作
  • 提取文件(文件夹)名称小工具目录树文件名字提取BAT脚本加软件
  • 解码分布式节点技术:五大核心特质赋能多行业数字化落地
  • jQuery Mobile 过渡
  • Moltbot 超详细安装使用教程(初学者版)
  • 7-16 WPS JS宏 RandBetween、Address实例8--[唯一性]类的应用
  • 7-15 WPS JS宏 class、constructor自定义关于[唯一性]的类
  • Spark On Yarn架构