首页 > 编程语言 >KMP 算法

KMP 算法

时间:2024-09-04 21:47:24浏览次数:11  
标签:主串 int s2 s1 ne 算法 KMP

\(Question:\)

给定一个模式串P和一个主串S, 求模式串P在主串S中出现的位置(字符串下标均从1开始)

\(Solution:\)

模式串中

  • next 函数

next[i] 表示模式串 P[1, i]中相等前后缀的最长长度

  • 运用双指针:i 扫描模式串, j 扫描前缀

  • 初始化 ne[1] = 0, i = 2, j = 0;

ne[1] = 0;
for(int i = 2, j = 0; i <= n; i ++) {
    while(j && p[i] != p[i + 1]) j = ne[j]; // 若不等则跳回能匹配的位置
    if(p[i] == p[i + 1]) j ++; // 若匹配则则j + 1,指向匹配前缀的末尾
    ne[i] = j; // next[i] 等于j的值
}

模式串与主串匹配

  • 还是运用双指针:i 扫描主串, j 扫描模式串

  • 初始化 i = 1, j = 0;

for(int i = 1, j = 0; i <= m; i ++) {
    while(j && s[i] != p[i + 1]) j = ne[j]; // 若不等,让j回跳到能匹配的位置
    if(s[i] == p[i + 1]) j ++; // 若匹配j向右走一步
    if(j == n) cout << i - n + 1 << endl; // 若完全匹配则输出结果
}

总代码

#include <bits/stdc++.h>

using namespace std;

string s, p;
int ne[10005], n, m;

int main() {
    cin >> s>> p;
    n = p.size(), m = s.size();
    ne[1] = 0;
    for(int i = 2, j = 0; i <= n; i ++) {
        while(j && p[i] != p[i + 1]) j = ne[j];
        if(p[i] == p[i + 1]) j ++;
        ne[i] = j;
    }
    for(int i = 1, j = 0; i <= m; i ++) {
        while(j && s[i] != p[i + 1]) j = ne[j];
        if(s[i] == p[i + 1]) j ++;
        if(j == n) cout << i - n + 1 << endl;
    }
    return 0;
}

注意代码中的字符串下标都是从1开始的,而不是0开始

  • 例题:

P3375 【模板】KMP

点击查看代码
#include <bits/stdc++.h>

using namespace std;
const int N = 1e6 + 10;

string s1, s2;
int ne[N];


int main() {
	cin >> s1 >> s2;
	s1 = ' ' + s1, s2 = ' ' + s2;
	ne[1] = 0;
	for(int i = 2, j = 0; i <= s2.size() - 1; i ++) {
		while(j && s2[i] != s2[j + 1]) j = ne[j];
		if(s2[i] == s2[j + 1]) j ++;
		ne[i] = j;
	}
	for(int i = 1, j = 0; i <= s1.size() - 1; i ++) {
		while(j && s1[i] != s2[j + 1]) j = ne[j];
		if(s1[i] == s2[j + 1]) j ++;
		if(j == s2.size() - 1) {
			cout << i - s2.size() + 2 << endl;
			j = ne[j];
		}
	}
	for(int i = 1; i <= s2.size() - 1; i ++) {
		cout << ne[i] << " ";
	}
	return 0;
}

标签:主串,int,s2,s1,ne,算法,KMP
From: https://www.cnblogs.com/yishujia/p/18397407

相关文章

  • 基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
    1.课题概述基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,对比UKF,EKF迭代UKF,迭代EKF四种卡尔曼滤波的控制效果。2.系统仿真结果3.核心程序与模型版本:MATLAB2022aX_iukf=zeros(2,Times1);X_iukf(:,1)=state0;P_iukf=zeros(2,2,Times1);P_iukf(:,:,1......
  • 基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
    1.课题概述       基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,对比UKF,EKF迭代UKF,迭代EKF四种卡尔曼滤波的控制效果。 2.系统仿真结果  3.核心程序与模型版本:MATLAB2022a%迭代扩展卡尔曼滤波X_iukf=zeros(2,Times1);X_iukf(:,1)=state0......
  • 多目标应用:四种多目标优化算法(NSOOA、NSPSO、NSDBO、NSCOA)求解柔性作业车间调度问题(F
    一、柔性作业车间调度问题柔性作业车间调度问题(FlexibleJobSchedulingProblem,FJSP)的描述如下:n个工件{J,J......
  • 计算机毕业设计推荐-基于python的协同过滤算法音乐推荐系统
    精彩专栏推荐订阅:在下方主页......
  • 相亲交友系统如何运用算法匹配理想伴侣
    在数字化时代,相亲交友系统已经成为寻找理想伴侣的重要途径。作为程序员,我们致力于通过先进的算法,为用户提供精准的匹配服务,让相亲交友变得更加高效和有趣。相亲交友系统的核心在于算法,我们的团队运用了多种算法来确保每位用户都能找到最适合自己的伴侣。首先,我们采用了基于用户兴趣......
  • 算法与数据结构——AVL树(平衡二叉搜索树)
    AVL树在“二叉搜索树”章节提到,在多次插入和删除操作后,二叉搜索树可能退化为链表。在这种情况下,所有操作的时间复杂度将从O(logn)劣化为O(n)。如下图,经过两次删除节点操作,这棵二叉搜索树便会退化为链表再例如,下图所示的完美二叉树中插入两个节点后,树将严重向左倾斜,查找操作的......
  • 【自动驾驶】控制算法(七)离散规划轨迹的误差计算
    写在前面:......
  • 【深度学习 算法】深度学习算法工程师必备技能:从理论到实践的全面指南
    在人工智能飞速发展的今天,深度学习算法工程师成为了科技行业的热门职业。想要成为一名优秀的深度学习算法工程师,你需要掌握一系列的关键技能。以下是本文将为您介绍的必备技能,从理论到实践,助你一臂之力。深度学习算法工程师的技能要求可以分为以下几个方面:编程能力精通P......
  • 决策树之——C4.5算法及示例
    0前言本文主要讲述了决策树C4.5算法构建原理并举例说明。读者需要具备的知识有:信息熵、条件熵、信息增益、信息增益比。本文所使用的数据集为:西瓜数据集1.2节。1C4.5算法流程准备数据集:输入数据集包含多个样本,每个样本具有多个特征(属性)和一个目标类别标签。设置阈......
  • stm32之外部flash下载算法
    文章目录下载算法下载到芯片的核心思想算法程序中擦除操作执行流程擦除操作大致流程:算法程序中编程操作执行流程算法程序中校验操作执行流程创建MDK下载算法通用流程第1步,使用MDK提供好的程序模板第2步,修改工程名第3步,修改使用的器件第4步,修改输出算法文件的名字第5步,......