C++ | KMP算法模板

news/2024/12/22 0:20:53/

next数组初始化

char a[1000006];//原串
char p[1000006];//子串
int pmt[1000006];void getNext(int m){int j=0;pmt[0]=0;for(int i=1;i<m;++i){while(j>0 && p[i]!=p[j])j=pmt[j-1];if(p[i]==p[j])++j;pmt[i]=j;}
}

以下实例基于上述getNext函数及数据结构执行:

实例1:寻找并输出匹配位置

下例代码中,n为原串a长度,m为子串p长度。以原串第一个字母为下标‘0’位置。

void kmp_findstr(int n,int m){getNext(m);for(int i=0,j=0;i<n;i++){while(j && a[i]!=p[j])j=pmt[j-1];if(a[i]==p[j])++j;if(j==m){cout<<i-j+1<<endl;j=pmt[j-1];}}
}

实例2:寻找第一次匹配位置

函数返回原串第一次匹配子串的位置,如果不匹配则返回-1。

int kmp_findfirst(int n,int m){int place=-1;getNext(m);for(int i=0,j=0;i<n;++i){while(j>0 && p[j]!=a[i])j=pmt[j-1];if(p[j]==a[i])++j;if(j==m){place=i-m+1;break;}}return place;
}

实例3:计算匹配次数

int kmp_strcount(int n,int m){int i,j=0,res=0;getNext(m);for(i=0;i<n;++i){while(j>0 && p[j]!=a[i])j=pmt[j-1];if(p[j]==a[i])++j;if(j==m)++res;}return res;
}


PS: 力扣周赛最后一题用到KMP了,直接AC。 😊
顺便附上源代码:

class Solution {
private:char num[1000006];char p[1000006];int kmp_next[1000006];void getNext(int m){int j=0;kmp_next[0]=0;for(int i=1;i<m;++i){while(j>0 && p[i]!=p[j])j=kmp_next[j-1];if(p[i]==p[j])++j;kmp_next[i]=j;}}int kmp(int n,int m){int i,j=0,res=0;getNext(m);for(i=0; i<n; ++i){while(j>0 && p[j]!=num[i])j=kmp_next[j-1];if(p[j]==num[i])++j;if(j==m)++res;}return res;}
public:int countMatchingSubarrays(vector<int>& nums, vector<int>& pattern) {int n=nums.size(),m=pattern.size();for(int i=0;i<n-1;i+=1){if(nums[i+1]>nums[i])num[i]='a';else if(nums[i+1]==nums[i])num[i]='b';else if(nums[i+1]<nums[i])num[i]='c';}num[n-1]='d';for(int i=0;i<m;i+=1){if(pattern[i]==1)p[i]='a';else if(pattern[i]==0)p[i]='b';else if(pattern[i]==-1)p[i]='c';}int res=kmp(n,m);return res;}
};

http://www.ppmy.cn/news/1350040.html

相关文章

Flink从入门到实践(三):数据实时采集 - Flink MySQL CDC

文章目录 系列文章索引一、概述1、版本匹配2、导包 二、编码实现1、基本使用2、更多配置3、自定义序列化器4、Flink SQL方式 三、踩坑1、The MySQL server has a timezone offset (0 seconds ahead of UTC) which does not match the configured timezone Asia/Shanghai. 参考资…

【JVM篇】ThreadLocal中为什么要使用弱引用

文章目录 &#x1f354;ThreadLocal中为什么要使用弱引用⭐总结 &#x1f354;ThreadLocal中为什么要使用弱引用 ThreadLocal可以在线程中存放线程的本地变量&#xff0c;保证数据的线程安全 ThreadLocal是这样子保存对象的&#xff1a; 在每个线程中&#xff0c;存放了一个…

notepad++成功安装后默认显示英文怎么设置中文界面?

前几天使用电脑华为管家清理电脑后&#xff0c;发现一直使用的notepad软件变回了英文界面&#xff0c;跟刚成功安装的时候一样&#xff0c;那么应该怎么设置为中文界面呢&#xff1f;具体操作如下&#xff1a; 1、打开notepad软件&#xff0c;点击菜单栏“Settings – Prefere…

嵌入式linux驱动开发之网络设备驱动

https://bbs.csdn.net/topics/612247295 简介 Linux网络设备驱动是Linux内核中的一个重要组成部分&#xff0c;它负责网络设备的底层数据传输和设备控制。与字符设备驱动和块设备驱动相比&#xff0c;网络设备驱动的特点和功能如下&#xff1a; 首先&#xff0c;网络设备驱动…

单片机与外设的交互

单片机与外设的交互是嵌入式系统中非常重要的一个基础知识点。单片机是一个集成在同一芯片上的中央处理器、存储器和输入/输出接口,它可以根据用户编写的程序与各种外部设备即外设进行交互。单片机与外设之间的交互主要通过单片机上的输入/输出口(I/O口)来实现。 I/O口的工作原…

类和对象——封装

师从黑马程序员 封装 封装的意义一 在设计类的时候&#xff0c;属性和行为写在一起&#xff0c;表现事物 语法&#xff1a; class 类名{ 访问权限&#xff1a;属性/行为 }&#xff1b; 设计一个圆类&#xff0c;求圆的周长 代码&#xff1a; 示例1&#xff1a; #inc…

【EAI 015】CLIPort: What and Where Pathways for Robotic Manipulation

论文标题&#xff1a;CLIPort: What and Where Pathways for Robotic Manipulation 论文作者&#xff1a;Mohit Shridhar1, Lucas Manuelli, Dieter Fox1 作者单位&#xff1a;University of Washington, NVIDIA 论文原文&#xff1a;https://arxiv.org/abs/2109.12098 论文出处…

安装opencart

一、安装模板 Install SO Emarket Opencart 4 Theme 一&#xff1a;so_emarket_quick2 二&#xff1a;theme package installation 1、installed opencart Default 2、Extensions->Installer->Upload->so_emarket_theme_oc4011_home21_to_home35_v2.0.3->so_theme…