LeetCode---377周赛---Floyd算法+字典树

题目列表

2974. 最小数字游戏

2975. 移除栅栏得到的正方形田地的最大面积

2976. 转换字符串的最小成本 I

2977. 转换字符串的最小成本 II

一、最小数字游戏

这题看懂题意就好,可以结合示例模拟一下,你就会发现规律,本质就是将数组排序,然后将相邻两个数字交换一下即可

代码如下

class Solution {
public:
    vector<int> numberGame(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int n=nums.size();
        for(int i=0;i<n-1;i+=2){
            swap(nums[i],nums[i+1]);
        }
        return nums;
    }
};

 二、移除栏杆得到的正方形田地的最大面积

这题就是单纯暴力求解两个栏杆之间的距离,代码如下

class Solution {
public:
    unordered_set<int> f(vector<int>&a,int mx){
        a.push_back(1);
        a.push_back(mx);
        sort(a.begin(),a.end());
        unordered_set<int>s;
        for(int i=0;i<a.size();i++){
            for(int j=i+1;j<a.size();j++){
                s.insert(a[j]-a[i]);
            }
        }
        return s;
    }
    int maximizeSquareArea(int m, int n, vector<int>& hFences, vector<int>& vFences) {
        auto h=f(hFences,m);
        auto v=f(vFences,n);
        int ans=0;
        for(auto x:h){
            if(v.count(x))
                ans=max(ans,x);
        }
        return ans?1LL*ans*ans%1000000007:-1;
    }
};

 三、转换字符串的最小成本I

这题的关键是你的看出来这是求全源最短路问题,题目要求将source变成target的最小成本,也就是字符之间的相互转换的代价最小,同时,题目允许出现一个字符到另一个字符中间有其他"中转站"的情况,很明显在考Floyd算法,代码如下

class Solution {
public:
    long long minimumCost(string source, string target, vector<char>& original, vector<char>& changed, vector<int>& cost) {
        map<pair<char,char>,int>mp;
        int n=source.size();
        int m=original.size();
        vector<vector<int>>g(26,vector<int>(26,-1));
        for(int i=0;i<m;i++){
            int x=original[i]-'a';
            int y=changed[i]-'a';
            if(g[x][y]==-1) g[x][y]=cost[i];
            else g[x][y]=min(g[x][y],cost[i]);
        }
        
        //Floyd算法
        for(int k=0;k<26;k++){
            for(int i=0;i<26;i++){
                for(int j=0;j<26;j++){
                    if(g[i][k]!=-1&&g[k][j]!=-1){
                        if(g[i][j]==-1) g[i][j]=g[i][k]+g[k][j];
                        else g[i][j]=min(g[i][k]+g[k][j],g[i][j]);
                    }
                }
            }
        }
        
        long long ans=0;
        for(int i=0;i<n;i++){
            if(source[i]!=target[i]){
                int x=source[i]-'a';
                int y=target[i]-'a';                
                if(g[x][y]!=-1) ans+=g[x][y];
                else return -1;
            }
        }
        return ans;
    }
};

四、转换字符串的最小成本II

这题和上一题一样,只是重字符之间的转化,改成了字符串之间的转换,我们依旧是用Floyd算法,但问题是我们如何标识和处理字符串,这里要用到字典树(208. 实现 Trie (前缀树) 标准的字典树模型,不认识的可以先去写这道题)。

同时,这题还需要用到dp,而且题目都帮我们降低难度了,说我们每次修改的区域不能出现重合。

状态定义为dp[i]表示以i为起始位置的字符串从source变成target的最小代价

dp[i]=min( dp[j] + g[i][j] ) 前提是区间[i,j]内的source字符串能变成target对应部分的字符串

代码如下

struct Node{
    Node*child[26]={0};
    int sid=-1;//用来标识字符串,表示以该结点为结尾的字符串序号
};

class Solution {
public:
    long long minimumCost(string source, string target, vector<string>& original, vector<string>& changed, vector<int>& cost) {
        Node*root=new Node();
        int sid=0;
        //字典树
        function<int(string)>put=[&](string s)->int{ 
            Node*node=root;
            for(auto e:s){
                int x=e-'a';
                if(node->child[x]==nullptr)
                    node->child[x]=new Node();
                node=node->child[x];
            }
            if(node->sid==-1)
                node->sid=sid++;
            return node->sid;
        };

        int n=original.size();
        vector<vector<int>>g(2*n,vector<int>(2*n,-1));
        for(int i=0;i<n;i++){
            int x=put(original[i]);
            int y=put(changed[i]);
            if(g[x][y]!=-1) g[x][y]=min(g[x][y],cost[i]);
            else g[x][y]=cost[i];
        }

        for(int k=0;k<sid;k++){
            for(int i=0;i<sid;i++){
                if(g[i][k]==-1) continue;//这行代码能进一步优化时间
                for(int j=0;j<sid;j++){
                    if(g[k][j]!=-1){
                        if(g[i][j]==-1) g[i][j]=g[i][k]+g[k][j];
                        else g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
                    }
                }
            }
        }

        int m=source.size();
        //递归写法
        // vector<long long>memo(m,-1);
        // function<long long(int)>dfs=[&](int i)->long long{
        //     if(i>=m) return 0;
        //     auto& res=memo[i];
        //     if(res!=-1) return res;
        //     res=LLONG_MAX/2;
        //     if(source[i]==target[i])//不要改
        //         res=dfs(i+1);
        //     Node*q=root,*p=root;
        //     for(int j=i;j<m;j++){
        //         q=q->child[source[j]-'a'];
        //         p=p->child[target[j]-'a'];
        //         if(q==nullptr||p==nullptr)
        //             break;
        //         if(q->sid<0||p->sid<0)
        //             continue;
        //         int d=g[q->sid][p->sid];
        //         if(d!=-1)
        //             res=min(res,dfs(j+1)+d);
        //     }
        //     return res;
        // };
        // long long ans = dfs(0);
        // return ans < LLONG_MAX / 2 ? ans : -1;

        //递推写法
        vector<long long>dp(m+1);
        for(int i=m-1;i>=0;i--){
            long long res=LLONG_MAX/2;
            if(source[i]==target[i])//不要改
                res=dp[i+1];
            Node*q=root,*p=root;
            for(int j=i;j<m;j++){
                q=q->child[source[j]-'a'];
                p=p->child[target[j]-'a'];
                if(q==nullptr||p==nullptr)
                    break;
                if(q->sid<0||p->sid<0)
                    continue;
                int d=g[q->sid][p->sid];
                if(d!=-1)
                    res=min(res,dp[j+1]+d);
            }
            dp[i]=res;
        }
        return dp[0]<LLONG_MAX/2?dp[0]:-1;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/279759.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】一篇文章深入解析联合体和枚举且和结构体的区别

文章目录 &#x1f4dd;前言&#x1f320; 联合体类型的声明&#x1f309;联合体的特点 &#x1f320;相同成员的结构体和联合体对⽐&#x1f309;联合体⼤⼩的计算 &#x1f320;联合体应用&#x1f309;枚举类型的声明 &#x1f320;枚举类型的优点&#x1f309; 枚举类型的使…

PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装

PostgreSQL10数据库源码安装及plpython2u、uuid-ossp插件安装 1、环境2、安装包下载3、安装3.1 、解压3.2、配置3.3、编译安装3.4 、启动与关闭 4、安装 uuid-ossp 、plpython2u插件5、参考 1、环境 centos 7 、 postgresql 10.19 2、安装包下载 postgres 源码安装包 3、安…

Git基础学习_p1

文章目录 一、前言二、Git手册学习2.1 Git介绍&前置知识2.2 Git教程2.2.1 导入新项目2.2.2 做更改2.2.3 Git追踪内容而非文件2.2.4 查看项目历史2.2.5 管理分支&#x1f53a;2.2.6 用Git来协同工作2.2.7 查看历史 三、结尾 一、前言 Git相信大部分从事软件工作的人都听说过…

共享单车之数据存储

文章目录 第1关&#xff1a;获取工作簿中的数据第2关&#xff1a;保存共享单车数据 第1关&#xff1a;获取工作簿中的数据 相关知识 获取工作簿中的信息&#xff0c;我们可以使用Java POI&#xff08;POI是一个提供API给Java程序对Microsoft Office格式档案读和写的功能&#…

[数据结构]树与二叉树的性质

文章目录 0.二叉树的形态和基本性质1.完全二叉树的叶子节点个数2.树的叶子节点个数3.线索二叉树4.树和森林和二叉树5.平衡二叉树的最少结点数6.树/二叉树/森林的转换 0.二叉树的形态和基本性质 一棵二叉树具有5中基本形态n个结点可以构造的二叉树种数: C2n-n/n1 一棵树 n个结点…

GC6208国产5V摄像机镜头驱动IC ,可用于摄像机,机器人等产品中可替代AN41908

GC6208是一个镜头电机驱动IC摄像机和安全摄像机。该设备集成了一个直流电机驱动器的Iris的PID控制系统&#xff0c;也有两个通道的STM电机驱动器的变焦和对焦控制。 芯片的特点: 内置用于Iris控制器的直流电机驱动器 内置2个STM驱动程序&#xff0c;用于缩放和…

【SD】inpaint 模型 - 换脸术 ☑

文生图-局部重绘 涂抹脸部 关键词添加lora&#xff1a; <lora:Naruto_zilaiye:1.5>, 生成图&#xff1a;

【音视频 ffmpeg 学习】 跑示例程序 持续更新中

环境准备 在上一篇文章 把mux.c 拷贝到main.c 中 使用 attribute(unused) 消除警告 __attribute__(unused)/** Copyright (c) 2003 Fabrice Bellard** Permission is hereby granted, free of charge, to any person obtaining a copy* of this software and associated docu…

.NetCore NPOI 读取excel内容及单元格内图片

由于数据方提供的数据在excel文件中不止有文字内容还包含图片信息&#xff0c;于是编写相关测试代码&#xff0c;读取excel文件内容及图片信息. 本文使用的是 NPOI-2.6.2 版本&#xff0c;此版本持.Net4.7.2;.NetStandard2.0;.NetStandard2.1;.Net6.0。 测试文档内容&#xf…

基于 Linux 的批量上传本地 Git 仓库到 Github 的实践

基于 Linux 的批量上传本地 Git 仓库到 Github 的实践 一、需求二、上传本地 Git 仓库2.1 初始版本2.2 优化版本 三、 GitHub 创建空仓库3.1 初始版本3.2 优化版本 四、Gitee 创建空仓库 一、需求 app目录下的每个文件夹都是一个git仓库&#xff0c;如何使用shell脚本将所有gi…

Linux文件系统结构及相关命令1(man pwd ls ctrl +Shift +T ls /etc)

Linux的文件系统结构 某所大学的学生可能在一两万人左右&#xff0c;通常将学生分配在以学院-系班为单位的分层组织机构中。 如何查找一名学生&#xff1f; 最笨的办法&#xff1a;依次问询大学中的每一个学生&#xff0c;直到找到为止。 查询效率高的方法&#xff1a;按照从…

Eureka服务注册与发现

1. Eureka简介 Eureka采用了CS的设计架构&#xff0c;Eureka Server 作为服务注册功能的服务器&#xff0c;它是服务注册中心。而系统中的其他微服务&#xff0c;使用 Eureka的客户端连接到 Eureka Server并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系…

微服务(1)

目录 1.什么是微服务&#xff1f;谈谈你对微服务的理解&#xff1f; 2.什么是Spring Cloud&#xff1f; 3.Springcloud中的组件有哪些&#xff1f; 3.具体说说SpringCloud主要项目&#xff1f; 5.SpringCloud项目部署架构&#xff1f; 1.什么是微服务&#xff1f;谈谈你对微…

idea配置docker推送本地镜像到远程私有仓库

目录 1&#xff0c;搭建远程Docker 私有仓库 Docker registry 2&#xff0c;Windows10/11系统上安装Docker Desktop 3&#xff0c;idea 配置远程私有仓库地址 4&#xff0c;idea 配置Docker 5&#xff0c;idea在本地构建镜像 6&#xff0c;推送本地Docker镜像到远程 Dock…

DotNet 命令行开发

DotNet 命令行开发 下载安装下载 SDK安装 SDK绿色版下载绿化脚本 常用命令创建 dotnet new运行 dotnet run发布应用 dotnet publish更多命令 VSCode 调试所需插件调试 CS 配置项目.csproj排除依赖关系 launch.jsontasks.json 参考资料 下载安装 下载 SDK 我们就下最新的好&am…

事实验证文章分类 Papers Category For Fact Checking

事实验证文章分类 Papers Category For Fact Checking By 2023.11 个人根据自己的观点&#xff0c;花了很多时间整理的一些关于事实验证领域证据召回&#xff0c;验证推理过程的文献综合整理分类&#xff08;不是很严谨&#xff09;。 引用请注明出处 欢迎从事事实验证Fact…

【开源】基于Vue+SpringBoot的就医保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…

基于ElementUI二次封装弹窗组件

效果&#xff1a; 一、自定义内容类型弹窗 <!-- title&#xff1a;对话框的标题confirmLoading&#xff1a;当前是否处于提交中titleCenter&#xff1a;对话框标题居中方式footerCenter&#xff1a;底部按钮的对其方式visible&#xff1a;是否显示弹窗width&#xff1a;设置…

重定向和转发的区别

重定向 1、定义 用户通过浏览器发送一个请求&#xff0c;Tomcat服务器接收这个请求&#xff0c;会给浏览器发送一个状态码302&#xff0c;并设置一个重定向的路径&#xff0c;浏览器如果接收到了这个302的状态码以后&#xff0c;就会去自动加载服务器设置的路径 一个页面跳转…

【测试开发与AIchat】它的思维跟大多数人还是一样的,都解决不了实际问题,可能是它也没有积累类似的经验[chatGPT]

分享一个人工智能{AI}解决问题的工具GPT(点我赶紧注册)&#xff0c;它是有GPT-4模型的。 它可以做很多事情&#xff0c;譬如问&#xff1a;开发平台功能 但是它仍然没有解决题主的问题。 源码如下&#xff1a; #....with smtplib.SMTP() as smtp:smtp.connect(smtp_server…
最新文章