算法笔记(十一)—— 并查集、KMP

news2025/2/23 12:35:19

并查集

支持集合快速合并

所有数据生成各自的集合,需要提供查询两个两素是不是属于一个集合,和集合合并操作,并查集能够在常数时间级别上对两个操作进行实现

1. 构造结构(数据+指针),将自己的指针指向自己,在查询操作时,只需要沿着指针走到头,看是否是一个元素,在合并操作时,另一个元素的指针指向需要合并的另一个元素(尺寸少的顶部挂在尺寸多的顶部下即可)

2. 在某次查找顶部节点时,将沿途节点的指针都直接指向顶部节点

3. 指针指向可以使用一个哈希表进行实现 elementmap fathermap sizemap(仅有顶部元素有记录)

KMP(字符串匹配加速算法)

有两个字符串str1、str2,查看str2是不是str1的子串

最长前缀(前缀和后缀的最大匹配长度):假设某个字符的之前的字符为abbabb,那么其最长前缀为abb,长度为3

假设str2为aabaabsa,那么根据其最长前缀信息作为其对应的next数组=[-1 0 1 0 1 2 3 0]

KMP流程:

1. 如果字符出现了不匹配,使用str2当前不匹配字符对应的next信息,将next对应字符移到当前不匹配位置进行比较

2. 如果str2移到第一个字符还是不能与srr1目前比对位置匹配,及next=-1时,将str1比对位置右移一位

求解next数组:

1. 0位置规定为-1,1位置规定为0

2. i位置是,利用i-1位的信息,如果next[i-1]=7,如果i-1的字符与第八个字符相同,next[i] = 8。如果不一样,就继续往前跳(利用第八个字符的next信息)

例题:

13 · 字符串查找 - LintCodeicon-default.png?t=N176https://www.lintcode.com/problem/13/?showListFe=true&page=1&submissionStatus=ACCEPTED&pageSize=50

class Solution {
public:
    vector<int> nexts;
    void cal_next(string str){
        if(str.size()==1){
            nexts.push_back(-1);
            return;
        }
        nexts.push_back(-1);
        nexts.push_back(0);
        int i = 2;
        int cn = 0;
        while(i < str.size()){
            if(str[i-1]==str[cn]){
                nexts.push_back(cn+1);
                cn++;
                i++;
            }
            else if(cn>0){
                cn = nexts[cn];
            }
            else{
                nexts.push_back(0);
                i++;
            }
        }
    }

    int strStr(string &source, string &target) {
        int len1 = source.size();
        int len2 = target.size();
        if(len2>len1)return -1;
        cal_next(target);
        int pos1 = 0 , pos2 = 0;
        while(pos1<len1&&pos2<len2){
            if(source[pos1]==target[pos2]){
                pos1++;
                pos2++;
            }
            else if(pos2>0){
                pos2 = nexts[pos2];
            }
            else{
                pos1++;
            }
        }
        return pos2==len2?pos1-pos2:-1;
    }
};

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

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

相关文章

激光雷达介绍

全球汽车行业正在进行自动化变革&#xff0c;这将彻底改变交通运输的安全和效率水平。戴姆勒在S级豪华车型中引入L3级自动驾驶&#xff08;L3&#xff0c;在特定条件下自动驾驶&#xff0c;人类驾驶员一旦被请求就会随时接管&#xff09;是自动驾驶革命的一个重大突破。其他多家…

浅谈SQL中的union和union all

文章目录概念基础语法使用技巧区别总结概念 MySQL UNION 操作符用于连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。 UNION 操作符选取不同的值&#xff0c;如果允许得到重复的值&#xff0c;可以使用 UNION ALL 基础语法 -- u…

基于Spring Boot+Vue的在线考试系统(有错题训练功能)

文章目录项目介绍主要功能截图&#xff1a;登录系统日志在线考试错题训练考试记录题库管理试题管理角色管理用户管理部分代码展示设计总结项目获取方式&#x1f345; 作者主页&#xff1a;Java韩立 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、…

解决:文档根元素 “configuration“ 必须匹配 DOCTYPE 根 “null“或者“mapper” 必须匹配 DOCTYPE 根 “null”

文档根元素 "configuration" 必须匹配 DOCTYPE 根 "null 出现的原因是在配置mybatis-config.xml的时候没有把文件中的配置信息加进去导致的 解决的方式只需要在<configuration>标签前面加上如下内容: <?xml version"1.0" encoding"UT…

MySQL —— 库的操作

文章目录1. 创建数据库2. 字符集和校验规则3. 数据库的基本操作3.1 查看数据库3.2 显示创建数据库的语句3.3 修改数据库3.4 删除数据库3.5 备份&#xff0c;还原数据库4. 查看数据库的连接情况1. 创建数据库 基本语法&#xff1a; create database if not exists 数据库名 选项…

共享内存

简介&#xff1a; 共享内存两个或多个进程共享物理内存的同一块区域&#xff08;通常被称为段&#xff09;&#xff0c;由于一个共享内存段会称为一个进程用户空间的一部分&#xff0c;因此这种IPC机制无需内核介入。需要做的就是让一个进程将数据复制到共享内存段中&#xff…

数据挖掘,计算机网络、操作系统刷题笔记51

数据挖掘&#xff0c;计算机网络、操作系统刷题笔记51 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;orac…

剑指 Offer 32 - I. 从上到下打印二叉树

摘要 剑指 Offer 32 - I. 从上到下打印二叉树 剑指 Offer 32 - II. 从上到下打印二叉树 II 剑指 Offer 32 - III. 从上到下打印二叉树 III 一、二叉树的层序遍历 题目要求的二叉树的从上至下打印&#xff08;即按层打印&#xff09;&#xff0c;又称为二叉树的广度优先搜索…

解决问题:resource IDS cannot be used in a switch statement in Android library

# 发现问题在抽取lib的时候发现了这样一个问题&#xff0c;如图所示&#xff1a;1. 很正常的onClick事件的处理&#xff0c;使用的swtich语句&#xff0c;但是却报了resource IDS cannot be used in a switch statement in Android library这个问题&#xff0c;原因是...2. and…

kafka架构体系

Kafka简介 Kafka是一个由Scala和Java编写的企业级的消息发布和订阅系统&#xff0c;最早是由Linkedin公司开发&#xff0c;最终开源到Apache软件基金会的项目。Kafka是一个分布式的&#xff0c;支持分区的&#xff0c;多副本的和多订阅者的高吞吐量的消息系统&#xff0c;被广…

【单目标优化算法】樽海鞘群算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

安装vue的具体步骤

首先到官网下载一个node.js官网地址为&#xff1a;http://nodejs.cn/安装教程&#xff1a;选Node.js.runtime和 Add to Path都可以&#xff0c;建议选Add to Path添加到环境变量。这里不用勾选&#xff0c;直接下一步&#xff0c;就可以安装成功了所有的步骤都是在命令窗口执行…

【数据结构趣味多】八大排序

目录 1.直接插入排序 基本思想 代码实现&#xff1a; 直接插入排序的特性总结&#xff1a; 2.希尔排序 基本思想 代码实现 &#xff08;递归实现&#xff09; 希尔排序的特性总结 3.直接选择排序 基本思想 代码实现&#xff1a; 直接选择排序的特性总结 4.堆排序 …

Umi框架

什么是 umi umi 是由 dva 的开发者 云谦 编写的一个新的 React 开发框架。umi 既是一个框架也是一个工具&#xff0c;可以将它简单的理解为一个专注性能的类 next.js 前端框架&#xff0c;并通过约定、自动生成和解析代码等方式来辅助开发&#xff0c;减少开发者的代码量。 u…

进程内存机制及API及详解

一、进程概念 ​ 一个程序文件&#xff08;program&#xff09;&#xff0c;只是一堆待执行的代码和部分待处理的数据&#xff0c;他们只有被加载到内存中&#xff0c;然后让 CPU 逐条执行其代码&#xff0c;根据代码做出相应的动作&#xff0c;才形成一个真正“活的”、动态的…

Verilog 学习第五节(串口发送部分)

小梅哥串口部分学习part1 串口通信发送原理串口通信发送的Verilog设计与调试串口发送应用之发送数据串口发送应用之采用状态机实现多字节数据发送串口通信发送原理 1&#xff1a;串口通信模块设计的目的是用来发送数据的&#xff0c;因此需要有一个数据输入端口 2&#xff1a;…

CRM联系人管理是什么?为什么它很重要?

在今天这个快节奏的商业世界里&#xff0c;要记住每个客户的名字和他们的个人喜好是很难的。这就是为什么必须以电子方式存储数据&#xff0c;在需要时与团队成员分享&#xff0c;并不断收集信息以成功地与客户和顾客互动的原因。本文是为那些想利用CRM系统改善客户关系的企业主…

是时候为您的银行机构选择构建一个知识库了!

知识管理和自助服务客户支持在银行业至关重要。选择正确的知识库对于帮助客户和在内部共享信息同样重要。繁重的法规和合规性需求意味着银行必须在他们选择的知识库类型上投入大量思考。许多银行知识库已经过时&#xff0c;无法为客户提供成功使用您的产品和服务所需的信息。在…

算法训练营 day51 动态规划 打家劫舍系列

算法训练营 day51 动态规划 打家劫舍系列 打家劫舍 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#…

Educational Codeforces Round 143 (Rated for Div. 2) 题解

D. Triangle Coloring 大意&#xff1a; 给定一个有 n 个点 n 条边的无向带权图&#xff0c;保证 n 为 6 的倍数&#xff0c;组成 n/3个三元环&#xff1a; (1,2,3),(4,5,6),⋯。 现在给每个点染上红或蓝两种颜色&#xff0c;要求红色有 n/2 个点、蓝色也有 n/2 个点 。 定义…