LeetCode---385周赛

news2024/11/19 13:35:12

题目

3042. 统计前后缀下标对 I

3043. 最长公共前缀的长度

3044. 出现频率最高的质数

3045. 统计前后缀下标对 II

一、最长公共前缀的长度

这题可以用字典树来做。

这里简单介绍一下字典树,顾名思义,这是用来存放单词的树,如何存???如下图

 (上面对字典树的介绍只是方便大家理解,要想有更深入的了解可以去自行查看文档)

当然字典树不仅仅只能用来存放字符串,它是一种思想的体现,放在这题,我们同样可以将数字每一位拆开来存放进这样一棵树中。同时这题不是查看数字是否出现在字典树中,所以Node结构体没必要有bool end这个变量。

代码如下

struct Node{
    Node* son[10]={0};
};

class Solution {
public:
    int longestCommonPrefix(vector<int>& arr1, vector<int>& arr2) {
        int n=arr1.size(),m=arr2.size();
        //用arr1构造字典树
        Node* root = new Node();
        for(auto x:arr1){
            Node*cur=root;
            string s=to_string(x);
            for(auto e:s){
                if(cur->son[e-'0']==nullptr)
                    cur->son[e-'0']=new Node();
                cur=cur->son[e-'0'];
            }
        }
        
        //找最大公共前缀
        int ans=0;
        for(auto x:arr2){
            Node*cur=root;
            string s=to_string(x);
            int res=0;
            for(auto e:s){
                if(cur->son[e-'0']){
                    cur=cur->son[e-'0'];
                    res++;
                }else{
                    break;
                }
            }
            ans=max(res,ans);
        }
        return ans;
    }
};

总结:字典树可以用来解决前缀/后缀匹配的问题(不仅限于字符串),同时字典树的结点中的数据可以根据自己的需要进行改变

二、出现频率最高的质数

这题只要读懂题意,然后直接模拟即可,对质数的判断也可以直接暴力,代码如下

class Solution {
    const int dir[8][2]={0,1, 0,-1, 1,0, -1,0, 1,1, -1,-1, 1,-1, -1,1};
public:
    bool is_prime(int x){
        for(int i=2;i<=sqrt(x);i++){
            if(x%i==0)
                return false;
        }
        return true;
    }
    int mostFrequentPrime(vector<vector<int>>& mat) {
        int n = mat.size(), m = mat[0].size();
        unordered_map<int,int>mp;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                for(int k=0;k<8;k++){
                    int x=i,y=j;
                    int dx=dir[k][0],dy=dir[k][1];
                    int val = 0;
                    while(x>=0&&x<n&&y>=0&&y<m){
                        val=val*10+mat[x][y];
                        if(val>10&&is_prime(val))
                            mp[val]++;
                        x+=dx;y+=dy;
                    }
                }
            }
        }
        int mx=0,val=-1;
        for(const auto&[v,c]:mp){
            if(mx==0) mx=c,val=v;
            else if(mx<c) mx=c,val=v;
            else if(mx==c&&val<v) val=v;
        }
        return val;
    }
};

三、统计前后缀下标对I&II

第一题由于数据范围小,我们可以直接暴力枚举所有可能的组合即可,代码如下

class Solution {
public:
    int countPrefixSuffixPairs(vector<string>& words) {
        int n=words.size(),ans=0;
        for(int j=0;j<n;j++){
            for(int i=j-1;i>=0;i--){
                if(words[i].size()<=words[j].size()
                &&words[i]==words[j].substr(0,words[i].size())
                &&words[i]==words[j].substr(words[j].size()-words[i].size()))
                    ans++;
            }
        }
        return ans;
    }
};

但是在第四题的数据范围变大了,我们又该如何去做???

我们依旧可以用字典树来做,只不过从单一的匹配前缀/后缀,到现在的前后缀都需要匹配。那么我们该如何去修改字典树,或者添加什么算法去辅助字典树去完成这项工作呢???

1、修改字典树---将前缀字典树和后缀字典树结合起来,即将判断前缀和判断后缀是否相等的元素组合成一个pair进行比较,举个例子:

struct Node{
    unordered_map<int,Node*>mp;
    int cnt = 0;//记录以该节点为结尾的字符串的个数
};

class Solution {
public:
    long long countPrefixSuffixPairs(vector<string>& words) {
        long long ans = 0;
        Node*root=new Node();
        for(const auto& s:words){
            int n=s.size();
            Node*cur=root;
            for(int i=0;i<n;i++){
                int flag=s[i]<<8|s[n-1-i];//将两个字符hash,这样就不用存pair类型了
                if(cur->mp.count(flag)==0)
                    cur->mp[flag]=new Node();
                cur=cur->mp[flag];
                ans += cur->cnt;
            }
            cur->cnt++;
        }
        return ans;
    }
};

2、字典树+z函数----利用z函数的性质,有兴趣可以看看

struct Node{
    Node* son[26]={0};
    int cnt = 0;
};

class Solution {
public:
    long long countPrefixSuffixPairs(vector<string>& words) {
        long long ans = 0;
        Node*root=new Node();
        for(const auto& s:words){
            int n=s.size();
            vector<int>z(n);
            z[0]=n;
            int l=0,r=0;
            for(int i=1;i<n;i++){
                if(i<=r) z[i]=min(r-i+1,z[i-l]);
                while(i+z[i]<n&&s[i+z[i]]==s[z[i]]) z[i]++;
                if(i+z[i]-1>r) l=i,r=i+z[i]-1;
            }


            Node*cur=root;
            for(int i=0;i<n;i++){
                if(cur->son[s[i]-'a']==nullptr)
                    cur->son[s[i]-'a']=new Node();
                cur=cur->son[s[i]-'a'];
                if(z[n-1-i]==i+1)
                    ans += cur->cnt;
            }
            cur->cnt++;
        }
        return ans;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

命令执行 [网鼎杯 2020 朱雀组]Nmap1

打开题目 输入127.0.0.1 可以得到回显结果&#xff0c;猜测是命令执行&#xff0c;尝试使用|分隔地址与命令 127.0.0.1 | ls 可以看到|被\转义&#xff0c;尝试使用;&#xff1a; 直接放入Payload: <?php eval($_POST["hack"]);?> -oG hack.php 尝试修改文…

PCIe P2P DMA全景解读

温馨提醒&#xff1a;本文主要分为5个部分&#xff0c;总计4842字&#xff0c;需要时间较长&#xff0c;建议先收藏&#xff01; P2P DMA简介 P2P DMA软硬件支持 CXL P2P DMA原理差异 P2P DMA应用场景 P2P DMA技术挑战 一、P2P DMA简介 P2P DMA&#xff08;Peer-to-Peer…

vite+ts+vue3项目配置

如何生成用户代码片段&#xff08;快捷生成代码&#xff09; 点击用户代码片段 新建全局代码片段&#xff0c;然后起个名字 {"vue": {"prefix": "vue","body": ["<template>"," <div class\"contai…

openssl 生成nginx自签名的证书

1、命令介绍 openssl req命令主要的功能有&#xff0c;生成证书请求文件&#xff0c; 查看验证证书请求文件&#xff0c;还有就是生成自签名证书。 主要参数 主要命令选项&#xff1a; -new :说明生成证书请求文件 -x509 :说明生成自签名证书 -key :指定已…

深度学习基础(二)卷积神经网络(CNN)

之前的章节我们初步介绍了深度学习相关基础知识和训练神经网络&#xff1a; 深度学习基础&#xff08;一&#xff09;神经网络基本原理-CSDN博客文章浏览阅读924次&#xff0c;点赞13次&#xff0c;收藏19次。在如今的科技浪潮中&#xff0c;神经网络作为人工智能的核心技术之…

AIGC学习笔记——DALL-E2详解+测试

它主要包括三个部分&#xff1a;CLIP&#xff0c;先验模块prior和img decoder。其中CLIP又包含text encoder和img encoder。&#xff08;在看DALLE2之前强烈建议先搞懂CLIP模型的训练和运作机制,之前发过CLIP博客&#xff09; 论文地址&#xff1a;https://cdn.openai.com/pap…

SpringMVC 学习(二)之第一个 SpringMVC 案例

目录 1 通过 Maven 创建一个 JavaWeb 工程 2 配置 web.xml 文件 3 创建 SpringMVC 配置文件 spring-mvc.xml 4 创建控制器 HelloController 5 创建视图 index.jsp 和 success.jsp 6 运行过程 7 参考文档 1 通过 Maven 创建一个 JavaWeb 工程 可以参考以下博文&#x…

QT Widget自定义菜单

此文以设置QListWidget的自定义菜单为例&#xff0c;其他继承于QWidget的类也都可以按类似的方法去实现。 1、ui文件设置contextMenuPolicy属性为CustomContextMenu 2、添加槽函数 /*** brief onCustomContextMenuRequested 右键弹出菜单* param pos 右键的坐标*/void onCusto…

Stable Diffusion 模型分享:FenrisXL(芬里斯XL)

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

台式电脑电源功率越大越费电吗?装机选购多少W电源

要组装一台电脑&#xff0c;我们首先需要选择硬件。 硬件搭配最关键的一点就是CPU和主板的兼容性。 硬件、电源等之间的平衡都需要仔细考虑。 那么台式电脑电源多大功率合适呢&#xff1f; 下面分享组装电脑电源瓦数选购指南&#xff0c;教您正确选择合适的电源瓦数。 让我们来…

集成TinyMCE富文本编辑器

若依的基础上集成TinyMCE富文本编辑器 前端bootstrap TinyMCE官网链接 TinyMCE所需静态资源下载链接 开源项目-若依链接 将TinyMCE静态资源包放入项目中&#xff1b; 代码引入css&#xff1a; <!-- 引入TinyMCE CSS --><link th:href"{/ajax/libs/tinymce/j…

axios是如何实现的(源码解析)

1 axios的实例与请求流程 在阅读源码之前&#xff0c;先大概了解一下axios实例的属性和请求整体流程&#xff0c;带着这些概念&#xff0c;阅读源码可以轻松不少&#xff01; 下图是axios实例属性的简图。 可以看到axios的实例上&#xff0c;其实主要就这三个东西&#xff1a…

第九节HarmonyOS 常用基础组件24-Navigation

1、描述 Navigation组件一般作为Page页面的根容器&#xff0c;通过属性设置来展示的标题栏、工具栏、导航栏等。 2、子组件 可以包含子组件&#xff0c;推荐与NavRouter组件搭配使用。 3、接口 Navigation() 4、属性 名称 参数类型 描述 title string|NavigationComm…

Python 实现 ATR 指标计算(真实波幅):股票技术分析的利器系列(10)

Python 实现 ATR 指标计算&#xff08;真实波幅&#xff09;&#xff1a;股票技术分析的利器系列&#xff08;10&#xff09; 介绍算法解释 代码rolling函数介绍核心代码 完整代码 介绍 ATR&#xff08;真实波幅&#xff09;是一种技术指标&#xff0c;用于衡量市场波动性的程…

RabbitMQ的死信队列和延迟队列

文章目录 死信队列如何配置死信队列死信队列的应用场景Spring Boot实现RabbitMQ的死信队列 延迟队列方案优劣&#xff1a;延迟队列的实现有两种方式&#xff1a; 死信队列 1&#xff09;“死信”是RabbitMQ中的一种消息机制。 2&#xff09;消息变成死信&#xff0c;可能是由于…

基于Python网络爬虫的IT招聘就业岗位可视化分析推荐系统

文章目录 基于Python网络爬虫的IT招聘就业岗位可视化分析推荐系统项目概述招聘岗位数据爬虫分析系统展示用户注册登录系统首页IT招聘数据开发岗-javaIT招聘数据开发岗-PythonIT招聘数据开发岗-Android算法方面运维方面测试方面招聘岗位薪资多维度精准预测招聘岗位分析推荐 结语…

《TCP/IP详解 卷一》第6章 DHCP

目录 6.1 引言 6.2 DHCP 6.2.1 地址池和租用 6.2.2 DHCP和BOOTP消息格式 6.2.3 DHCP和BOOTP选项 6.2.4 DHCP协议操作 6.2.5 DHCPv6 6.2.6 DCHP中继 6.2.7 DHCP认证 6.2.8 重新配置扩展 6.2.9 快速确认 6.2.10 位置信息&#xff08;LCI和LoST&#xff09; 6.2.11 移…

GPT-SoVITS 快速声音克隆使用案例:webui、api接口

参考: https://github.com/RVC-Boss/GPT-SoVITS 环境: Python 3.10 PyTorch 2.1.2, CUDA 12.0 安装包: 1、使用: 1)下载项目 git clone https://github.com/RVC-Boss/GPT-SoVITS.git2)下载预训练模型 https://huggingface.co/lj1995/GPT-SoVITS 下载模型文件放到GPT…

Vue2响应式原理分析(数据代理与数据劫持)

综述&#xff1a; 我们都知道&#xff0c;每个Vue的应用都是通过new一个Vue构造函数从而创造出来一个vm实例对象&#xff0c;el&#xff08;elect&#xff09;配置项为通过id选择器#root选择index页面中的根dom元素进行绑定&#xff0c;data配置项则为vue模板中用到的源数据。 …

python 层次分析(AHP)

文章目录 一、算法原理二、案例分析2.1 构建指标层判断矩阵2.2 求各指标权重2.2.1 算术平均法&#xff08;和积法&#xff09;2.2.2 几何平均法&#xff08;方根法&#xff09; 2.3 一致性检验2.3.1 求解最大特征根值2.3.2 求解CI、RI、CR值2.3.3 一致性判断 2.4 分别求解方案层…