news 2026/4/17 15:54:26

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 14:24:37

Python字典与集合:高效数据管理的艺术

SQLAlchemy是Python中最流行的ORM&#xff08;对象关系映射&#xff09;框架之一&#xff0c;它提供了高效且灵活的数据库操作方式。本文将介绍如何使用SQLAlchemy ORM进行数据库操作。目录安装SQLAlchemy核心概念连接数据库定义数据模型创建数据库表基本CRUD操作查询数据关系操…

作者头像 李华
网站建设 2026/4/16 20:33:54

模板代码版本兼容

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第…

作者头像 李华
网站建设 2026/4/12 5:12:53

2026大模型就业指南:技术演进、核心技能与职业规划

文章详细介绍了2025年大模型技术的四个演进阶段&#xff0c;分析了就业市场的三大核心技能要求&#xff08;RAG系统、智能体任务自动化、模型对齐优化&#xff09;&#xff0c;列出了关键技术栈和推荐实践项目&#xff0c;并提供了职业发展建议。文章强调企业对垂直领域定制化、…

作者头像 李华
网站建设 2026/4/16 13:25:33

《Ionic Tab(选项卡)详解与使用指南》

《Ionic Tab(选项卡)详解与使用指南》 引言 在移动应用开发中,选项卡(Tab)是一种常见的界面元素,它可以帮助用户快速切换不同的内容或功能。Ionic框架作为一款流行的前端框架,提供了丰富的组件和工具,其中包括了功能强大的Tab组件。本文将详细解析Ionic Tab的使用方法…

作者头像 李华