news 2026/6/10 1:04:19

leetcode 2977(Dijkstra + DP)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
leetcode 2977(Dijkstra + DP)

2977: 转换字符串的最小成本Ⅱ

思路:动态规划 + 图最短路径

  • 不相交性质:转换操作的子串要么完全相同,要么不相交。这意味着每个位置只需考虑直接转换到最终状态,无需考虑中间转换步骤。

  • 子串独立性:可以将问题分解为:将source的前i个字符变为target的前i个字符的最小代价。

class Solution { public: long long minimumCost(string source, string target, vector<string>& original, vector<string>& changed, vector<int>& cost) { int n=source.size(); set<int> lens; for(const auto& str:original) lens.insert(static_cast<int>(str.size())); unordered_set<string> orig(original.begin(),original.end()); unordered_set<string> chan(changed.begin(),changed.end()); //初始化dp vector<long long> dp(n+1,LONG_LONG_MAX); dp[0]=0; //构建图 unordered_map<string,vector<pair<string,int>>> graph; for(int i=0;i<original.size();i++){ graph[original[i]].emplace_back(changed[i],cost[i]); } //dijkstra单源最短路径 auto dijkstra=[&graph, &changed](string& src){ unordered_set<string> visited; unordered_map<string,long long> dist; for(const auto& dest:changed){ dist[dest]=LONG_LONG_MAX; } dist[src]=0; for(int i=0;i<changed.size();i++){ auto min_dist=LONG_LONG_MAX; string min_dest; for(const auto& [dest,dist]:dist){ if(!visited.contains(dest) && dist<min_dist){ min_dist=dist; min_dest=dest; } } if(min_dist==LONG_LONG_MAX) return dist; visited.insert(min_dest); dist[min_dest]=min_dist; for(const auto& [neighbour,weight]:graph[min_dest]){ if(!visited.contains(neighbour) && min_dist+weight<dist[neighbour]){ dist[neighbour]=min_dist+weight; } } } return dist; }; unordered_map<string,unordered_map<string,long long>> dist; for(int i=1;i<=n;i++){ int j=0; while(j<*lens.rbegin() && i-j-1>=0 && source[i-j-1]==target[i-j-1]){ dp[i]=min(dp[i],dp[i-j-1]); j++; } if(j==*lens.rbegin()) continue; //逐个尝试替换不同长度的子串 for(auto begin=lens.upper_bound(j);begin!=lens.end() && *begin<=i;begin++){ auto len=*begin; auto src=source.substr(i-len,len); auto dest=target.substr(i-len,len); if(src!=dest && orig.contains(src) && chan.contains(dest) && dp[i-len]!=LONG_LONG_MAX){ if(!dist.contains(src)) dist[src]=dijkstra(src); if(dist[src][dest]!=LONG_LONG_MAX){ dp[i]=min(dp[i],dp[i-len]+dist[src][dest]); } } } } return dp[n]==LONG_LONG_MAX ? -1:dp[n]; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:15:56

OFA-VE开源模型实战:低成本GPU算力方案实现高精度图文逻辑判断

OFA-VE开源模型实战&#xff1a;低成本GPU算力方案实现高精度图文逻辑判断 1. 什么是OFA-VE&#xff1a;不只是模型&#xff0c;而是一套可落地的视觉理解工作流 你有没有遇到过这样的问题&#xff1a;一张商品图配了一段文案&#xff0c;但你不确定文案是否真实反映了图片内…

作者头像 李华
网站建设 2026/5/22 19:12:18

C语言对话-16.Al-Go-Rithms

徐波 翻译 各类报道纷至沓来。地表附近及邻近空间正发生什么事&#xff0c;我根本摸不着头脑。从各种迹象看&#xff0c;亚洲人似乎已经占领了这个地方&#xff0c;但到目前为止&#xff0c;我还没有看到他们。 我和珍妮正与世隔绝般地在地下古城工作。这是一个奇妙的&#x…

作者头像 李华
网站建设 2026/6/10 18:31:49

PHP每次请求重复初始化的庖丁解牛

“PHP 每次请求重复初始化” 是传统 PHP-FPM 模型的核心瓶颈&#xff0c;它导致 框架加载、类解析、配置读取等开销在每次请求中重复发生&#xff0c;严重限制高并发性能。 一、核心机制&#xff1a;请求生命周期 ▶ 1. PHP-FPM 请求流程 #mermaid-svg-zFxmSH64zS6kXbuz{font-…

作者头像 李华
网站建设 2026/6/9 23:48:08

主页加载手动检查流程:软件测试从业者实用指南

在Web应用测试中&#xff0c;主页加载性能直接影响用户体验和业务转化率。手动检查作为自动化测试的补充&#xff0c;能捕捉细微问题&#xff0c;如视觉错位或资源阻塞。本文针对软件测试从业者&#xff0c;系统梳理主页加载的手动检查流程&#xff0c;涵盖准备、执行和问题诊断…

作者头像 李华
网站建设 2026/6/10 17:57:39

Android开发工程师面试指南:基于成都高新菁蓉汇智人才服务有限公司职位需求

成都高新菁蓉汇智人才服务有限公司 Android开发工程师 (MJ000373) 职位信息 岗位职责 1、负责客户端和手机端APP程序的方案和架构设计,开发和维护等工作 2、根据需求完成Android系统应用的需求开发、测试和功能维护,高质量完成产品功能迭代; 3、快速准确理解需求,并通过简洁…

作者头像 李华