补题与总结:leetcode第 377 场周赛

文章目录

    • 写在最前面的复盘
    • 2977. 转换字符串的最小成本 II(Flody 爆搜优化->dp)

写在最前面的复盘

感谢leetcode,丰富了我为数不多的卡常经验
2是简单思维题,但卡常
4是爆搜优化,也卡常,补题时给卡麻了

对于4,赛时只想到爆搜思路,时间不够,没得想优化。个人认为这题的字符串转换过程没法一眼dp,也可能是我经验不够多,但从爆搜优化到记忆化/dp的过程是非常值得学习的
然后就是一个全新的知识点,对于前缀相同的子字符串截取,使用Trie树查找的效率很高,这时就不要使用unordered_map<string, int>
还有就是Flody的剪枝,对于稀疏图来说,这个剪枝的效果非常好
最后就是卡常,leetcode好像不能用全局变量,所以这题用二维array优化了一个地方,也是第一次用array,为了不被卡常,以后能用array就尽量用

2977. 转换字符串的最小成本 II(Flody 爆搜优化->dp)

2977. 转换字符串的最小成本 II - 力扣(LeetCode)
image.png

根据上题的经验,首先建有向图,用Flody求最短距离,但是需要将original和changed中的字符串映射为唯一编号
这里的映射不能使用unordered_map<string, int>,原因在于后续的求解中,C++的substr太慢

最大的问题是:要替换哪些子字符串?对于每个字符,都有替换和不替换两种情况,若替换,则要在source和target中,截取该字符往后的子字符串,若能替换,则从子字符串的后一个字符开始搜索
这里有一个优化,使用substr截取字符串吗?截取后通过unordered_map<string, int>索引唯一编号吗?这种做法时间开销巨大,考虑到每次截取字符串的特征:以相同字符开头。若当前截取的字符串不是图中的点,那么后续的字符串也一定不是图中的点,因为后续字符串的前缀肯定包含当前字符串。根据前缀的特性,可以使用Trie树保存字符串,并且保存每个字符串的唯一下标

以上思路为爆搜,时间复杂度 2 1000 2^{1000} 21000,无法通过。考虑优化,若当前搜索到第i个字符,并且替换了长度为j的子字符串,那么下一次的搜索要从第i+j个字符开始,可以预测,这个将被多次搜索,所以想到记忆化搜索。或者,考虑到替换操作的向后依赖性,是否能先确定当前位置向后的状态呢?
当前状态f[i]为:将source的第i个字符以及向后的所有字符替换的最小代价,i从后往前遍历,这样每次搜索依赖的状态就是确定的

class Solution {
public:
    long long minimumCost(string source, string target, vector<string>& original, vector<string>& changed, vector<int>& cost) {
        // vector<vector<int>> son(10010, vector<int>(30, 0));
        array<array<int, 30>, 10010> son; 
        for (int i = 0; i < 10010; ++ i) son[i].fill(0);
        vector<int> idx(10010, 0);
        int cnt = 1, n = 0;
        auto insert = [&](string& s){
            int p = 0;
            for (auto t : s)
            {
                int v = t - 'a';
                if (!son[p][v]) son[p][v] = cnt ++ ;
                p = son[p][v];
            }
            if (!idx[p]) idx[p] = ++ n;
            return idx[p];
        };
        for (auto& s : original) insert(s);
        for (auto& s : changed) insert(s);
        long long INF = 1e17;
        vector<vector<long long>> g(n + 10, vector<long long>(n + 10, INF));
        for (int i = 1; i <= n; ++ i) g[i][i] = 0;
        for (int i = 0; i < original.size(); ++ i)
        {
            int x = insert(original[i]), y = insert(changed[i]);
            g[x][y] = min(g[x][y], (long long)cost[i]);
        }
        for (int k = 1; k <= n; ++ k)
            for (int i = 1; i <= n; ++ i)
            {
                if (g[i][k] == INF) continue;
                for (int j = 1; j <= n; ++ j)
                    g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
            }

        int m = source.size();
        vector<long long> d(1010, INF); d[m] = 0;
        for (int i = m - 1; i >= 0; -- i)
        {
            if (source[i] == target[i]) d[i] = d[i + 1];
            int s = 0, t = 0;
            for (int j = 0; i + j < m; ++ j)
            {
                s = son[s][source[i + j] - 'a'], t = son[t][target[i + j] - 'a'];
                if (s == 0 || t == 0) break;
                int x = idx[s], y = idx[t];
                if (x == 0 || y == 0) continue;
                d[i] = min(d[i], d[i + j + 1] + g[x][y]);
            }
        }
        if (d[0] >= INF / 2) return -1;
        else return d[0];
    }
};

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

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

相关文章

腾讯NCNN环境部署及pt到ncnn模型转换推理

该内容还未完整&#xff0c;笔记内容&#xff0c;后期补充。 一、模型转换 yolov5s v6.2训练的pt模型&#xff0c;直接导tourchscript&#xff0c;然后时候ncnn里面的pnnx工具直接转换为ncnn 二、部署环境 1.安装vunlkan 1.2.198.1版本&#xff0c;记得配置环境变量 2.安装…

SSH远程登陆服务器

截取自文章&#xff1a;SSH简介及两种远程登录的方法_ssh -CSDN博客 SSH的安装 SSH分为客户端 openssh-client 和服务器 openssh-server&#xff0c;可以利用以下命令确认电脑上是否安装了客户端和服务器。 dpkg -l | grep ssh 如果只是想远程登陆别的机器只需要安装客户端&…

【Web API系列】使用getDisplayMedia来实现录屏功能

文章目录 前言一、认识getD该处使用的url网络请求的数据。二、使用步骤1.使用方法一实现录屏2.使用方法二实现录屏3. 运行效果 延伸 前言 Web API经过长期的发展&#xff0c;尤其是最近&#xff0c;发展相当迅猛&#xff0c;现在已经支持很多功能了&#xff0c;一些原生就支持…

IDEA相关操作

目录 连接MySQL IDEA配置Maven 配置全局Maven 导入Maven项目 方法一 方法二 安装Mybatisx插件 连接MySQL 填写user和Password之后测试连接 如果是第一次连接需要联网下载数据库连接驱动&#xff0c;安装提示下载即可 如果显示如下错误需要更改时区 Server returns …

虚拟机安装windows2012和虚拟机安装国产系统deepin

虚拟机安装windows2012和虚拟机安装国产系统deepin 一.安装windows20121.安装VMWare虚拟机2.1.注意点一&#xff1a;VMWare虚拟网卡2.2.注意点二&#xff1a;配置虚拟网络编辑器3.安装配置Windows Server 2012 R23.1激活windows121.利用下面两个文件进行windows激活2.运行exe文…

5G NR无线蜂窝系统的信道估计器设计

文章目录 DMRS简介DMRS类型DMRS频域密度 信道估计实验仿真实验参数实验实验结论 DMRS简介 DMRS类型 类型A&#xff1a;DMRS位于时隙的第二个或第三个OFDM符号&#xff0c;由14个OFDM符号组成&#xff0c;当数据占据大部分时隙时使用A型映射。 类型B&#xff1a;用在URLLC中&a…

Linux 学习

复制/etc 文件夹到/mnt 目录 cp -r(-a) /etc /mnt回到上一次文件夹 cd -切换到当前用户的家目录_cd ~________________________如何查找ls 命令的位置_______which ls_________________________________请写出ll 命令中查看到的7大文件类型缩写 - s l p c b …

PDF编辑工具--Acrobat Pro DC 2023中文

Acrobat Pro DC 2023是一款功能强大的PDF编辑和管理软件&#xff0c;它可以帮助用户在创建、编辑、转换和共享PDF文档方面达到前所未有的高度。这款软件提供了丰富的编辑功能&#xff0c;使用户能够轻松添加注释、高亮、下划线、插入文本等&#xff0c;自由地编辑PDF文档。除了…

【MySQL变更】gh-ost原理解读

gh-ost简介 gh-ost是处理MySQL在线表结构变更的工具&#xff0c;与pt-osc 不同&#xff0c;gh-ost不会使用触发器。 gh-ost 可以进行测试&#xff0c;暂停&#xff0c;动态控制和重新配置&#xff0c;审计还有其他许多操作perks。 命名 最初它被命名为gh-osc&#xff1a;Git…

电子电气架构——车载ECU刷写工具vFlash简介

电子电气架构——车载ECU刷写工具vFlash简介 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 没有人关注你。也无需有人关注你。你必须承认自己的价值&a…

12.26 字符指针

一.基本应用 声明一个字符指针,char *ptr 初始化//在定义指针时,可以将它的初位置定义为空,即char *s NULL char *ptr "Hello"; // 指向字符串字面量的指针 char arr[] "World"; // 字符数组 char *ptr2 arr; // 指向字符数组的指针 访问指针指…

ALS-运动系统解构

角色握持 角色蓝图&#xff1a;将物体绑在手上 动作蓝图&#xff1a; 将握持动画截取一帧&#xff08;explicit time时间写好&#xff09; 角色替换 在原人物模型下面加一个骨骼体&#xff08;先不用添加模型&#xff09;&#xff0c;重命名为bodymesh AI使用流程 新建一…

【OAuth2】:赋予用户控制权的安全通行证--代码模拟篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于OAuth2的相关操作吧 上篇已经讲了oauth2的相关知识&#xff0c;详解了oauth2的四种授权模式中的授权码模式&#xff0c;那么这一篇我们就来讲一下授权码模式的…

基于5G智能网关的智慧塔吊监测方案

塔吊是建筑施工中必不可少的设施&#xff0c;由于塔吊工作重心高、起重载荷大、人工视距/视角受限等因素&#xff0c;也使得塔吊在工作过程中着较多的危险因素。对此&#xff0c;可以部署基于工业5G智能网关搭建智慧塔吊安全监测系统&#xff0c;实现对塔吊运行的全局精细监测感…

NLP论文阅读记录 - 以大语言模型为参考学习总结

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作2.1文本生成模型的训练方法2.2 基于LLM的自动评估2.3 LLM 蒸馏和基于 LLM 的数据增强 三.本文方法3.1 Summarize as Large Language Models3.1.1 前提3.1.2 大型语言模型作为参考具有…

随记-语义分割

Semantic Segmentation 什么是语义分割全卷积网络FCN摘要 什么是语义分割 语义分割 Semantic Segmentation 旨在对图像的每个像素进行分类&#xff0c;将其分配给预定义的语义类别。 &#xff08;检测图像中的物体并按属性分类&#xff09; 实例分割 Instance Segmentation 实…

一台服务器​最大并发 tcp 连接数多少?65535?

首先&#xff0c;问题中描述的65535个连接指的是客户端连接数的限制。 在tcp应用中&#xff0c;server事先在某个固定端口监听&#xff0c;client主动发起连接&#xff0c;经过三次握手后建立tcp连接。那么对单机&#xff0c;其最大并发tcp连接数是多少呢&#xff1f; 如何标…

HttpClient基础

简介&#xff1a; HttpClient是Apache的一个子项目&#xff0c;可以提供高效的、功能丰富的支持HTTP协议的客户端编程工具包&#xff0c;并且它支持HTTP协议最新的版本和建议。 作用&#xff1a; 发送HTTP请求接收响应数据 使用 导入maven坐标&#xff1a; <dependency&g…

VSLAM:对极几何

文章目录 概要对极约束推导参考概要 透视几何的缺陷是图像深度信息的丢失,如图1所示,根据相似变换关系,视线上的若干平面都映射为成像面上的一个平面。 图1 对极几何是两个透视几何模型间的几何约束关系,主要用于实现基于三角测量的双目立体视觉、深度估计等,对极几何约…

【代码学习】多标签分类 multilabel classfication | loss如何计算? | 衡量指标如何计算?

文章目录 loss计算 | BCELoss(), 最后sigmoid映射为0-1区间值衡量指标计算 sklearn.metrics代码 MultiLabelClassifier /CelebA_Classification_PyTorch_Github.ipynb loss计算 | BCELoss(), 最后sigmoid映射为0-1区间值 gpt解释 import torch import torch.nn as nn# 创建模…