leetcode 2976(Floyd-Warshall 算法)

2976: 转换字符串的最小成本Ⅰ

思路:将字符转换 问题建模为图的最短路径 问题,使用 Floyd-Warshall 算法预处理所有字母对之间的最小转换成本。

  1. 问题建模
  • 将 26 个小写字母看作图中的 26 个节点
  • 每个转换规则 originali -> changedi 看作一条有向边,权重为 costi
  • 目标:找到从source中每个字符到target中对应字符的++最小++转换成本
  1. 初始化距离矩阵
  • 创建一个 26×26 的二维数组 g,存储所有字母对之间的最小转换成本
  • 对角线元素初始化为 0 (同一字符转换成本为 0)
  • 其他元素初始化为一个很大的数 INF (这里用 0x3f3f3f3f)

为什么选择 0x3f3f3f3f?

0x3f3f3f3f(十进制约1,061,109,999,即 10^9 级别)是算法竞赛中常用的"无穷大"值。

  1. 添加直接转换边
  • 遍历所有给定的转换规则
  • 对于每条规则 original[i] -> changed[i],取权重的最小值 (因为可能有重复规则)
  1. Floyd-Warshall 算法
  • 三重循环:k → i → j
  • 对于每个中间节点 k,尝试通过 k 来缩短 i 到 j 的路径
  • 核心公式:gij = min(gij, gik + gkj)
  • 算法结束后,gab 就是从字母 a 转换到字母 b 的最小成本
  1. 计算总成本
  • 遍历 source 和 target 的每个位置

  • 如果当前字符相同,跳过 (成本为 0)

  • 如果 gsource_chartarget_char == INF,说明无法转换,返回 -1

  • 否则累加最小转换成本

    class Solution {
    public:
    long long minimumCost(string source, string target, vector& original, vector& changed, vector& cost) {
    int g[26][26];
    memset(g,0x3f,sizeof(g));
    for(int i=0;i<26;i++) g[i][i]=0;
    for(int i=0;i<original.size();i++){
    int x=original[i]-'a',y=changed[i]-'a';
    g[x][y]=min(g[x][y],cost[i]);
    }
    for(int k=0;k<26;k++){
    for(int i=0;i<26;i++){
    if(g[i][k]>=0x3f3f3f3f) continue;
    for(int j=0;j<26;j++){
    g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
    }
    }
    }
    long long ans=0;
    for(int i=0;i<source.size();i++){
    int a=source[i]-'a',b=target[i]-'a';
    if(g[a][b]>=0x3f3f3f3f) return -1;
    ans+=g[a][b];
    }

    复制代码
          return ans;
      }

    };

相关推荐
下午写HelloWorld6 分钟前
【概念与应用】轻量级加密算法LEA、动态脱敏算法DDA、零知识证明ZKP和优化协同交互协议OCIP
算法·区块链·密码学·安全架构·零知识证明
飞舞哲26 分钟前
三维点云最小二乘拟合MATLAB程序
开发语言·算法·matlab
YHHLAI32 分钟前
JavaScript 数据结构精讲:数组底层与实战避坑
开发语言·javascript·数据结构
Coder-magician33 分钟前
《代码随想录》刷题打卡day12:二叉树part02
数据结构·c++·算法
海梨花1 小时前
字节面试高频算法题
java·算法·面试·职场和发展
aqiu1111111 小时前
python02
算法
瓦特what?1 小时前
位运算核心技巧与应用
java·jvm·算法
无限码力1 小时前
阿里算法岗 0530笔试真题 - 荆棘林的最优砍断计划
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试真题·阿里巴巴笔试真题
人道领域1 小时前
【LeetCode刷题日记】90.子集Ⅱ--- 归纳题解
java·开发语言·leetcode
随意起个昵称1 小时前
线性dp-LIS题目5(导弹拦截,二分优化)
c++·算法·动态规划