KMP哈希算法

KMP算法

KMP算法是一种字符串匹配算法,用于匹配模式串P在文本串S中出现的所有位置。

例如S=“ababac”,P="aba",那么出现的所有位置是1 3

KMP算法将原本O(n^2)的字符串匹配算法优化到了O(n),其精髓在于next数组,next数组表示此时模式串下标失配时应该移动到的位置,(每次下标失配时,就是i!=j了,j=next[j-1])也表示最长的相同真前后缀的长度。

字符串“aba”这个例子来说的话,前缀(从左往右数)有:a,ab,aba(因为aba与原字符相等,所以不是真前缀)后缀(从右往左):a,ba,aba

字符串aba 

a的真前缀真后缀为0  ab的真前缀为a真后缀为b,所以也为0  aba的最长真前缀真后缀为a(长度设为1)所以aba的真前缀真后缀为1

字符串ababac

abab 的真前缀为 a,ab,aba真后缀有b,ab,bab所以最长真前后缀为ab,即为2

ababa 的真前缀有 a,ab,aba,abab,真后缀有a,ba,aba,baba,所以最长真前后缀为aba,即为3

计算next数组(next数组仅与模式串P有关)的方式就是P自己去匹配自己

KMP算法模板

int[] next=new int[p.length];
next[0]=0;
for(in i=1,j=0;i<p.length;i++){

    while(j>0&&p[j]!=p[i]){
        j=next[j-1];//不断匹配i,j直到p[i]==p[j]或者j==0
    }
    if(p[i]==p[j]){
        j++;
         next[i]=j;
    }
   
}

通过next数组进行匹配

for(int i=0,j=0;i<n;i++){

    while(j>0&&s[i]!=p[j])j=next[j-1];
    if(s[i]==p[j])j++;
    if(j==m)//匹配成功一次
}    

 字符串Hash算法

(基于进制的)字符串Hash本质上时一个用数字表示一段字符串,从而降低字符串处理的复杂度。

这个数字是一个很大的数字,采用long类型,还需要一个进制数base,用于规定这个数字的进制

Hash数组h[i]表示字符串s[1~i]的Hash值,采用类似前缀和的形式以便求出任意一个字串的Hash值。

(字符串转化成为数字)

字符串Hash初始化

long base=131;//base一般为一个质数(进制数)

long h[N];//h[i]表示s[1~i]的Hash(类似前缀和)

char s[N];//我们的字符串

for(int i=1;i<=n;++i) h[i]=h[i-1]*base+s[i]-'A'+1;//s[i]-‘A’+1表示字符串在我们字母表中的位置

获取字串s[1]~s[r]的Hash

long getHash(int l,int r){

        return  h[r]-h[l-1]*b[r-l+1];//b[i]表示base的i次方(预处理)

}

  例题实战

斤斤计较的小 Z

题目描述

小 Z 同学没天都喜欢斤斤计较,今天他又跟字符串杠起来了。

他看到了两个字符串 S1 S2 ,他想知道 S1 在 S2 中出现了多少次。

现在给出两个串 S1,S2(只有大写字母),求 S1 在 S2 中出现了多少次。

输入描述

共输入两行,第一行为 S1,第二行为 S2。

输出描述

输出一个整数,表示 S1 在 S2 中出现了多少次。

输入输出样例

示例1

输入

LQYK
LQYK

输出

1

 代码

kmp实现
​

public class jinjinjijiao {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		char[] arr1=scan.next().toCharArray();
		char[] arr2=scan.next().toCharArray();
		int len1=arr1.length;
		int len2=arr2.length;
		int[] next=new int[len1];
		for(int i=1,j=0;i<len1;i++) {
			while(j>0&&arr1[i]!=arr1[j]) {
				j=next[j-1];
			}
			if(arr1[i]==arr1[j]) {
				j++;
			}
			next[i]=j;
		}
		int ans=0;
		for(int i=0,j=0;i<len2;i++) {
			while(j>0&&arr1[j]!=arr2[i]) {
				j=next[j-1];
			}
			if(arr1[j]==arr2[i]) {
				j++;
			}
			if(j==len1) {
				ans++;
				j=0;
			}
			
		}
		System.out.println(ans);
	}

}

​
Hash实现
package shiti;
import java.util.*;
public class Hash {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		char[] arr1=scan.next().toCharArray();
		char[] arr2=scan.next().toCharArray();
		int m=arr1.length;
		int n=arr1.length;
		long[] h=new long[n+1];
		long[] s=new long[n+1];
		long res=0;
		long base=131;
		for(int i=0;i<m;i++) {//先求arr1的hash值
			res=res*base+(arr1[i]-'A'+1);
		}
		s[0]=1;
		for(int i=1;i<=n;i++) {
			h[i]=h[i-1]*base+(arr2[i-1]-'A'+1);
			s[i]=s[i-1]*base;
			
		}
		int ans=0;
		for(int i=1;i+m-1<=n;i++) {
		long sum=h[i+m-1]-h[i-1]*s[m];
			if(sum==res)
				ans++;
		}
		
		System.out.println(ans);
	}

}

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

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

相关文章

MySQL使用C语言连接

要使用C语言连接mysql&#xff0c;需要使用mysql官网提供的库&#xff0c;大家可以去MySQL官网下载。 1.引入库 1.选择Download Archivs 因为我们要连接的是C语言&#xff0c;所以选择Connector/C。 选择合适的版本下载&#xff0c;我这里 下载完之后&#xff0c;我们使用rz命…

AtCoder Beginner Contest 347 (ABCDEF题)视频讲解

A - Divisible Problem Statement You are given positive integers N N N and K K K, and a sequence of length N N N, A ( A 1 , A 2 , … , A N ) A(A_1,A_2,\ldots,A_N) A(A1​,A2​,…,AN​). Extract all elements of A A A that are multiples of K K K, divi…

鸿蒙HarmonyOS应用开发之HID DDK开发指导

场景介绍 HID DDK&#xff08;HID Driver Develop Kit&#xff09;是为开发者提供的HID设备驱动程序开发套件&#xff0c;支持开发者基于用户态&#xff0c;在应用层开发HID设备驱动。提供了一系列主机侧访问设备的接口&#xff0c;包括创建设备、向设备发送事件、销毁设备。 …

腾讯云2核4G服务器优惠价格165元一年,限制500GB月流量

腾讯云轻量2核4G5M服务器租用价格165元1年、252元15个月、三年900元&#xff0c;配置为轻量2核4G5M、5M带宽、60GB SSD盘、500GB月流量、上海/广州/北京&#xff0c;腾讯云优惠活动 yunfuwuqiba.com/go/txy 腾讯云轻量2核4G5M服务器租用价格 腾讯云&#xff1a;轻量应用服务器1…

SpringBoot + Vue3邮件验证码功能的实现

后端 SpringBootmavenmysqlIDEA 后端负责编写邮件发送的接口逻辑&#xff0c;具体流程如下: 引入相关依赖配置邮箱信息编写邮件发送服务接口OK 引入依赖 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail --> <dependen…

基于FreeRTOS系统的STM32简易遥控器设计

项目说明 该项目是一个基于FreeRTOS系统的Stm32遥控器设计。使用该项目主要是自己学习FreeRTOS的使用&#xff0c;以及模块化编程的思想。这个项目应该长期会有更新。 项目开源 github:https://github.com/snqx-lqh/Stm32RemoteControl gitee:https://gitee.com/snqx-lqh/S…

conda 创建 python3.10.12 环境

conda 创建 python3.10.12 环境 介绍使用前置条件&#xff1a;安装 conda配置环境变量验证 Conda 安装结果创建环境&#xff1a;python激活 Anaconda 环境 验证 Python 版本。 介绍 Conda是一个开源的包管理和环境管理系统&#xff0c;由Continuum Analytics公司开发。它可以安…

【InternLM 实战营第二期笔记】InternLM1.8B浦语大模型趣味 Demo

体验环境 平台&#xff1a;InternStudio GPU&#xff1a;10% 配置基础环境 studio-conda -o internlm-base -t demo 与 studio-conda 等效的配置方案 conda create -n demo python3.10 -y conda activate demo conda install pytorch2.0.1 torchvision0.15.2 torchaudio2…

使用MySQL和PHP创建一个公告板

目录 一、创建表 二、制作首页&#xff08;创建主题以及显示列表&#xff09; 三、制作各个主题的页面&#xff08;输入回帖和显示列表&#xff09; 四、制作消息的查询界面 五、制作读取数据库信息的原始文件 六、制作数据重置页面 七、效果图 八、问题 1、目前无法处…

轻量应用服务器16核32G28M腾讯云租用优惠价格4224元15个月

腾讯云16核32G服务器租用价格4224元15个月&#xff0c;买一年送3个月&#xff0c;配置为&#xff1a;轻量16核32G28M、380GB SSD盘、6000GB月流量、28M带宽&#xff0c;腾讯云优惠活动 yunfuwuqiba.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云16核32G服务器租用价格 腾讯…

三栏布局——面试/笔试题

目录 三栏布局(两端指定宽度&#xff0c;中间自适应)三栏布局(平均分布) 三栏布局(两端指定宽度&#xff0c;中间自适应) 只介绍简单的写法&#xff0c;圣杯布局之类的比较复杂&#xff0c;实际上越简单越好&#xff0c;所以复杂的就不介绍了 flex布局 <!DOCTYPE html>…

vultr ubuntu 服务器远程桌面安装及连接

一. 概述 vultr 上开启一个linux服务器&#xff0c;都是以终端形式给出的&#xff0c;默认不带 ui 桌面的&#xff0c;那其实对于想使用服务器上浏览器时的情形不是很好。那有没有方法在远程服务器安装桌面&#xff0c;然后原程使用呢&#xff1f;至少ubuntu的服务器是有的&am…

HTTP/1.1、HTTP/2、HTTP/3 演变(计算机网络)

HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f; HTTP/1.1 相比 HTTP/1.0 性能上的改进&#xff1a; 使用长连接改善了短连接造成的性能开销。支持管道网络传输&#xff0c;只要第一个请求发出去了&#xff0c;不必等其回来&#xff0c;就可以发第二个请求出去&#xff0c…

数据库----数据类型正确选择

mysql支持的数据类型&#xff1a; 数值型&#xff0c;如INT&#xff0c;BIGINT&#xff0c;FLOAT和decimal 日期和时间类型&#xff0c;如DATE,TIME和TIMESTAMP等 字符串类型&#xff0c;如VARCHAR,CHAR和BLOB 空间数据类型&#xff0c;如GEOMETRY&#xff0c;POINT和POLYGON J…

解决创建springboot项目时,无法选中java8的问题

主要原因是springboot3.0.0以上版本需要jdk17. 问题描述&#xff1a; 解决办法&#xff1a; 在Server url上点击齿轮&#xff0c;把http://start.springboot.io/更改为https://start.aliyun.com/ 效果如下

速通汇编(三)寄存器及汇编mul、div指令

一&#xff0c;寄存器及标志 AH&ALAX(accumulator)&#xff1a;累加寄存器BH&BLBX(base)&#xff1a;基址寄存器CH&CLCX(count)&#xff1a;计数寄存器DH&DLDX(data)&#xff1a;数据寄存器SP(Stack Pointer)&#xff1a;堆栈指针寄存器BP(Base Pointer)&#…

C#调用FreeSpire.Office读取word数据的基本用法

FreeSpire.Office是Spire.Office的免费版本&#xff0c;后者支持全面、复杂的office文件操作功能&#xff0c;包括文件格式转换、文档操作、文档打印等&#xff0c;详细介绍见下图及参考文献1。本文学习FreeSpire.Office的基本用法并用其获取word文档的基本信息。   新建Win…

python统计分析——双样本均值比较

参考资料&#xff1a;python统计分析【托马斯】 1、配对样本t检验 在进行两组数据之间的比较时&#xff0c;有两种情况必须区分开。在第一种情况中&#xff0c;同一对象在不同时候的两个记录值进行相互比较。例如&#xff0c;用学生们进入初中时的身高和他们一年后的身高&…

学习transformer模型-Positional Encoding位置编码的简明介绍

今天介绍transformer模型的positional encoding 位置编码 背景 位置编码用于为序列中的每个标记或单词提供一个相对位置。在阅读句子时&#xff0c;每个单词都依赖于其周围的单词。例如&#xff0c;有些单词在不同的上下文中具有不同的含义&#xff0c;因此模型应该能够理解这…

鸿蒙OS开发实例:【ArkTS 实现MQTT协议】

介绍 MQTT是物联网中的一种协议&#xff0c;在HarmonyOS API9平台&#xff0c;解决方案以C库移植为实现方案。 遥遥领先的平台&#xff0c;使用MQTT怎能不遥遥领先呢&#xff01; 新年快乐&#xff0c;本篇将带领你手把手实现HarmonyOS ArkTS语言的MQTT协议。 准备 阅读…