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

LeetCode 2976.转换字符串的最小成本 I:floyd算法(全源最短路)

【LetMeFly】2976.转换字符串的最小成本 I:floyd算法(全源最短路)

力扣题目链接:https://leetcode.cn/problems/minimum-cost-to-convert-string-i/

给你两个下标从0开始的字符串sourcetarget,它们的长度均为n并且由小写英文字母组成。

另给你两个下标从0开始的字符数组originalchanged,以及一个整数数组cost,其中cost[i]代表将字符original[i]更改为字符changed[i]的成本。

你从字符串source开始。在一次操作中,如果存在任意下标j满足cost[j] == zoriginal[j] == x以及changed[j] == y。你就可以选择字符串中的一个字符x并以z的成本将其更改为字符y

返回将字符串source转换为字符串target所需的最小成本。如果不可能完成转换,则返回-1

注意,可能存在下标ij使得original[j] == original[i]changed[j] == changed[i]

示例 1:

输入:source = "abcd", target = "acbe", original = ["a","b","c","c","e","d"], changed = ["b","c","b","e","b","e"], cost = [2,5,5,1,2,20]输出:28解释:将字符串 "abcd" 转换为字符串 "acbe" : - 更改下标 1 处的值 'b' 为 'c' ,成本为 5 。 - 更改下标 2 处的值 'c' 为 'e' ,成本为 1 。 - 更改下标 2 处的值 'e' 为 'b' ,成本为 2 。 - 更改下标 3 处的值 'd' 为 'e' ,成本为 20 。 产生的总成本是 5 + 1 + 2 + 20 = 28 。 可以证明这是可能的最小成本。

示例 2:

输入:source = "aaaa", target = "bbbb", original = ["a","c"], changed = ["c","b"], cost = [1,2]输出:12解释:要将字符 'a' 更改为 'b': - 将字符 'a' 更改为 'c',成本为 1 - 将字符 'c' 更改为 'b',成本为 2 产生的总成本是 1 + 2 = 3。 将所有 'a' 更改为 'b',产生的总成本是 3 * 4 = 12 。

示例 3:

输入:source = "abcd", target = "abce", original = ["a"], changed = ["e"], cost = [10000]输出:-1解释:无法将 source 字符串转换为 target 字符串,因为下标 3 处的值无法从 'd' 更改为 'e' 。

提示:

  • 1 <= source.length == target.length <= 105
  • sourcetarget均由小写英文字母组成
  • 1 <= cost.length== original.length == changed.length <= 2000
  • original[i]changed[i]是小写英文字母
  • 1 <= cost[i] <= 106
  • original[i] != changed[i]

解题方法:floyd算法

如何将source字符串变为target字符串?必须一个字符一个字符地通过cost[i]的代价将original[i]变为changed[i]来实现。

不难发现source中每个字符是独立的,并且从一个字符a aa经过数次变化最终变为字符b bb的最小代价也是固定的,所以我们不妨先计算出26 × 26 26\times 2626×26种字母的转换方式分别最少需要花费多少代价:

将26个字母看成图中26个顶点,

假设通过cost[i]的代价可以将original[i]变为changed[i],那么就看作有一个从节点original[i]指向节点changed[i]且代价为cost[i]的边。

floyd算法最适合算这个了,初始化floyd[i][i]=0,有直接a指向b的边的初始化floyd[a][b]为a指向b中代价最小的边,其他初始化为正无穷。然后:

for(intk=0;k<26;k++){for(inti=0;i<26;i++){for(intj=0;j<26;j++){floyd[i][j]=min(floyd[i][j],floyd[i][k]+floyd[k][j]);}}}

就计算出任何一个字母转为另一个字母的最小代价了。

对original字符串中每个字母做最小代价转换,累加并返回答案或-1即可。

  • 时间复杂度O ( l e n ( o r i g i n a l ) + l e n ( o r i g i n a l ) + C 2 ) O(len(original)+len(original)+C^2)O(len(original)+len(original)+C2),其中C = 16 C=16C=16
  • 空间复杂度O ( C 2 ) O(C^2)O(C2)

AC代码

C++
/* * @LastEditTime: 2026-01-31 12:22:44 */typedeflonglongll;classSolution{public:longlongminimumCost(string source,string target,vector<char>&original,vector<char>&changed,vector<int>&cost){ll floyd[26][26];memset(floyd,0x3f,sizeof(floyd));for(inti=0;i<26;i++){floyd[i][i]=0;}for(inti=0;i<original.size();i++){intx=original[i]-'a';inty=changed[i]-'a';floyd[x][y]=min(floyd[x][y],(ll)cost[i]);}for(intk=0;k<26;k++){for(inti=0;i<26;i++){for(intj=0;j<26;j++){floyd[i][j]=min(floyd[i][j],floyd[i][k]+floyd[k][j]);}}}ll ans=0;for(inti=0;i<source.size();i++){ll cost=floyd[source[i]-'a'][target[i]-'a'];if(cost>1000000000000){return-1;}ans+=cost;}returnans;}};

对了,邀请你看几个好看的hash:

  1. 8888a4
  2. 00009f
  3. 000097

还带签名的。

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

http://www.jsqmd.com/news/325930/

相关文章:

  • 一天一个Python库:markupsafe - 让你的字符串安全又优雅
  • ETASOLUTIONS钰泰 ETA1617S2G SOT23-6 LED驱动
  • 《实时渲染》第2章-图形渲染管线-2.5像素处理
  • CISO的战略抉择:面对“量子破解”威胁,是否该押注量子密钥分发?
  • 2026年非标热收缩包装机售后服务佳的厂家排名,哪家更靠谱
  • 暂时无法解决的关于STM32F103的RTC日期更新问题
  • 水利数采网关在智慧水务系统中的应用
  • 瑞安市华东包装机械有限公司技术实力如何,附可靠品牌排名
  • 盘点国内工业葡萄糖供货商,靠谱品牌推荐哪家
  • IT 的“控”与业务的“放”:构建基于 Web 原生架构的安全数据共享便捷的平台
  • 育龙化工生产工艺如何,起批量及优惠政策怎样
  • C++ 封装 C FFI 接口最佳实践:以 Hugging Face Tokenizer 为例
  • 2026年工业交换机品牌有哪些值得选,飞畅科技靠谱吗
  • 工业智能相机优质供货商的产品性价比排名如何?
  • 盘点镜视界,规模、产品及加盟培训支持情况大汇总
  • 震惊!2026年70%测试数据由AI合成
  • 2026年东北新中式家具品牌排名,致电库岸家具选靠谱之选
  • 剖析2026年温度变送器制造商,哪家口碑和性价比双高
  • 聊聊靠谱的新中式家具品牌商,新中式客厅家具特色全揭秘
  • 情感化量子测试:当代码需要“共情力”
  • 2026年天津新中式家具口碑推荐,库岸家具怎么样
  • 第二章 一致性协议
  • 5分钟掌握:绿色软件测试的国际新标准
  • 计算机毕业设计springboot基于JAVA的物流管理系统的设计与实现 基于SpringBoot框架的供应链运输调度平台设计与实现 基于Java技术的智能货运信息管理系统开发与实践
  • 基于SpringBoot的薪酬信息管理系统
  • AI重构测试生态下的内容突围之道
  • 2026年软件测试公众号热点解析:AI工作疲劳警报系统下的爆款密码
  • 心电辅助诊断-体检表格智能识读系统的设计与实现
  • 计算机毕业设计springboot基于VUE的儿童教育网站 基于SpringBoot与Vue框架的幼小衔接在线学习平台的设计与实现 采用SSM+Vue技术栈开发的少儿在线启蒙教育系统
  • 干翻系统自带,卸载神器,值得收藏