news 2026/3/1 22:08:41

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/28 5:10:17

基于ssm的农业管理系统8y15w544(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 开题报告内容 课题名称&#xff1a; 基于SSM框架的农业管理系统的设计与实现 一、 选题依据&#xff08;研究背景与意义&#xff09; 1. 研究背景 随着我国乡村振兴战略的全面推进和数字乡村建设的深入开展&#xff0c;传统农业正面临向现代化、精细化、智…

作者头像 李华
网站建设 2026/3/1 0:33:23

基于ssm社区老人健康服务跟踪系统l54o0ud2(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 开题报告内容 基于SSM的社区老人健康服务跟踪系统开题报告 一、选题背景与意义 选题背景 随着全球人口老龄化的加速推进&#xff0c;我国老年人口比例持续上升&#xff0c;社区老年人的健康问题日益成为社会关注的焦点。传统的社区健康服务模式存在诸多弊…

作者头像 李华
网站建设 2026/2/11 20:13:12

开关磁阻电机控制仿真:Matlab 2016b的探索之旅

开关磁阻电机控制仿真(matlab 2016b版本仿真模型 自用) 模型包涵&#xff1a; 开关磁阻电机传统控制&#xff1a;电流斩波控制、电压PWM控制、角度位置控制。 智能控制&#xff1a;12/8三相开关磁阻电机有限元分析本体建模、转矩分配函数控制、模糊PID控制、模糊角度控制、神经…

作者头像 李华
网站建设 2026/2/26 6:17:12

政策破冰:AI测试示范区的三重战略价值

山东菏&#xfffd;成为全国首个AI测试创新示范区&#xff0c;标志着国家层面对智能化测试技术落地的战略扶持。该示范区将聚焦金融、电商、工业软件三大领域&#xff0c;提供AI测试沙盒环境与算力补贴&#xff0c;加速企业级应用验证。从测试工程师视角看&#xff0c;这一政策…

作者头像 李华
网站建设 2026/2/17 4:15:03

【开题答辩全过程】以 基于安卓的空巢老人服务平台的开发为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/2/15 13:30:55

Vibe Coding 中的PRD

在 Vibe Coding 中&#xff0c;PRD 是驱动整个开发流程的核心文档。它像一份详细的指令集&#xff0c;指导 AI 助手理解并构建出符合预期的软件。1. 它是什么&#xff1a;项目的“菜谱”与“旅行计划”你可以把 PRD 理解为一份给 AI 看的综合性项目蓝图。像一份菜谱&#xff1a…

作者头像 李华