KMP算法

【KMP算法详解——适合初学KMP算法的朋友】 KMP算法的初级体验,只为抛砖引玉之用 阅读详情

KMP算法:

最经典的字符串匹配算法,即主串不回溯算法

eg:主串:abacabab  子串:abab

第一次匹配: 


第二次匹配:在第一次匹配中,主串与子串的第四个字符匹配失败,我们观察可知,子串中,第一个字符跟第二个字符不同,跟第三个字符相同,所以,直接将子串向右移动三个位置,子串的第二个字符跟主串的第四个字符开始匹配


第三次匹配:在第二次匹配中,子串第二个字符与主串的第四个字符匹配失败,所以从子串第一个字符开始跟主串第四个字符开始匹配


第四次匹配:在第三次匹配中主串的第四个字符与子串的第一个字符匹配失败,这是子串向右移一个位置,与主串的第五个字符相比较

 

通过四次匹配,最后主串和子串匹配成功。

通过上面的分析,我们可以看出,主串始终没有向前回溯。

我们假设,主串S中 i 位置的元素与子串T中 j 位置的元素匹配不成功,主串不回溯,子串回溯到k继续跟主串进行比较,那么存在以下结果:

T1...T(k-1)=s(i-k+1)...s(i-1); //k<=j-1

通过上面主串与子串的部分匹配可得:

T(j-k+1)..T(j-1)=s(i-k+1)...s(i-1);

那么这样就可以得到:

T1...T(k-1)=T(j-k+1)..T(j-1);

这个过程就表明,子串中可能存在想互重叠的子串。如果,将对于子串中j位置跟主串i位置不匹配时,那么就从子串的k位置开始跟主串的i位置进行比较的过程提取成一个式子:next[ j ]=k;

那么假设T(k)==T(j),那么根据上面的推导我们就可以知道next[ j+1 ]=k+1;如果T(k)≠T(j),next[ j ] = next[ k ],一次类推,最后得到next[ 1 ]=0

那么我们可以得到KMP的算法如下:

int kmp(String *mainStr,String *subStr) {

int i=0,j=0;

while(i<mainStr.length() && j<subStr.length()){

if(mainStr[ i ]== subStr[ j ]){

i++;

j++;

}else{

j=next[ j ];

}

}

if( j.>= subStr.length()){

return i-subStr.length();

}else{

return -1;

}

}

//求子串的next值,并将值保存到next数组中

void next(String *subStr , int next[ ]){

int i =1,j=0;

next [ 1 ] = 0;

while(i<subStr.length)

{

if((j==0) || (subStr[ i ] == subStr[ j ]) ){

i++ ; 

j++;

next[ i ]=j;

}else{

next[ i ]=next[ j ];

}

}

}



生成字符串的全排列,可以用回溯法实现 NULL 博文链接:https://yangkai.iteye.com/blog/585854 立即下载

相关推荐

YOLOv11 改进策略:引入 NWD 损失函数提高小目标检测精度

YOLO(You Only Look Once)是一种实时目标检测算法,能够有效地预测图像中多个物体的边界框和类别概率。其高效性使它成为自动驾驶、视频监控等领域的理想选择。NWD 是一种基于 Wasserstein 距离的损失函数,其通过归一化处理,更好地评估预测框和真实框之间的几何偏差。这种方法不仅仅关注重叠区域,而且考虑中心点和尺度信息,提高了对小目标的敏感度。

走向CTO的路上... 2005

KMP算法(失效函数)介绍

代码中 p[j] == p[k] 是这样的情况:这时 k = next[j] ,就是 j 和 k 都已被赋了值的,到 j 这里需要重置了即P[j] 不等于T[i],另外p[0 - (k-1)] == p[(j-k) -(j - 1)] ,"ab"是 P 的前缀字符串"abcab"的“最长的既是真前缀又是后缀的子串"也就是说假如完成了k++,j++的设置,P 的前缀字符串从"abcab"变成"abcabd",而"abcabd"子串的寻找和"abc"子串寻找的结果相同,所以代码是 k = next[k]。...

m0_52293362的博客 2817

OpenRA引擎实战:如何从零开始搭建一个经典RTS游戏模组(附资源包)

本文详细介绍了如何利用开源游戏引擎OpenRA从零开始搭建经典RTS游戏模组。内容涵盖开发环境配置、资源管线处理、YAML规则定义、地图编辑与Lua脚本编写等全流程实战指南,并提供了资源包,帮助开发者和爱好者快速创建属于自己的即时战略游戏世界。

silver的专栏 905

子串判定算法(KMP&字符串哈希)

题目描述 给定字符串haystack和needle,判定needle是否是haystack的子串。以下给出的两种算法复杂度均为O(m)。 传送门:Leetcode 28 KMP算法 首先计算needle的next数组,随后执行KMP算法。 class Solution { public: int strStr(string haystack, string needle) { if (needle.empty()) return 0;

Salmon_lee的博客 1014

【张量分解(二)】CP分解

一、CP分解 1.1 定义 CP分解就是将一个张量分解成多个单秩张量的和。例如,给定一个三阶张量X∈RI×J×K\mathcal{X}\in\mathbb{R}^{I\times J\times K}X∈RI×J×K,则CP分解可以写为 X≈∑r=1Rar∘br∘cr\mathcal{X}\approx\sum_{r=1}^{R}\textbf{a}_r\circ\textbf{b}_r\circ...

bqw的博客 2万+

TwinCAT3 实时核异步通信:基于ADS的C++ Server/Client数据交换实战解析

本文深入解析了在TwinCAT3实时核中,如何利用ADS协议实现C++ Server与Client之间的异步数据交换。文章从核心概念入手,详细阐述了实时核、ADS通信及异步机制,并通过实战步骤指导环境搭建、路由配置、Server端服务创建与Client端请求发起,重点剖析了Req/Ind/Res/Con异步回调模型,旨在帮助开发者构建高效、非阻塞的实时工业控制应用。

purple的博客 469

KMP —— 字符串分析算法

`快速`的从一个`主串`中找出一个你想要的`子串` —— 这里面的`主串`就是 `source 串`,而要寻找的 `子串` 就是 `pattern 串` 也叫 `模式串`。

三钻 - 之前端到全栈之路 8837

影像组学分析流程中,图像分割前要做的事(图像预处理)

在InputVolume中无法找到自己想要重采样的序列,这时可以检查一下序列的Volume type是不是MRMLMulti。这时,Volume type将由MRMLMulti改为Scaler,随后即可在3D slicer中完成Resample Scaler Volume。2.1、重采样:通过3Dslicer中的Resample Scaler Volume实现。具体设置参数:spacing(1,1,1),Interpolation选择Bspline。2、图像预处理:重采样和标准化。

weixin_45011313的博客 3724

KMP算法详解

KMP算法是一种字符串模式匹配算法,不同的来源讲解方式也不一样,很容易混乱,在这里以一种特殊的方式来讲解KMP算法,希望大家不再被这个问题所困扰。 一. 一些基础问题 什么是字符串的模式匹配? 给定两个串S=“s1s2s3 …sn”和T=“t1t2t3 …tn”,在主串S中寻找子串T的过程叫做模式匹配,T称为模式。 如何寻找? 我们先从比较好理解的暴力匹配(朴素模式匹配BF算法)开始,进而引出K...

yyzsir的博客 9万+

从NHANES到发表:如何用survey包完成符合CDC要求的统计分析(含完整R代码)

本文详细介绍了如何利用R语言的survey包,对美国国家健康与营养调查数据进行符合CDC要求的统计分析。文章重点解析了NHANES数据的复杂抽样设计、权重变量的正确选择与调整,并提供了从数据获取、清洗、构建调查设计对象到执行加权回归及生成发表级表格的完整R代码实战指南,帮助研究者避免常见错误,确保分析结果的准确性与可发表性。

weixin_29054245的博客 521

GD32H757的can通信配置,提供方案参考!

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值。

**My Coding Family** 1837

图解算法:KMP算法

目录第一章 暴力匹配实现第二章 KMP算法介绍第三章 KMP算法原理第四章 KMP的匹配表第五章 KMP算法实现 项目地址:https://gitee.com/caochenlei/algorithms 第一章 暴力匹配实现 【问题描述】 有一个字符串 str1 = “BBC ABCDAB ABCDABCDABDE”,和一个子串 str2 = “ABCDABD”,现在要判断 str1 是否含有 str2,如果存在,就返回第一次出现的位置,如果不存在,就返回-1。 【问题思路】 【代码实现】 publ

轻松的小希 8311

《QT+PCL》点云配准进阶——GROR配准

GROR点云配准

阁楼 1318

kmp算法总结

搞ACM也有三年了,期间学习了不少算法,到12月把上海站打完也要成退役狗了。最近突然想把学过的一些算法回过头来好好总结一下,于是就有了我的算法总结系列。这是这个系列的开端,所以先写一个简单点的算法,以后会慢慢复习一些复杂的算法,最后还是希望自己能够坚持下去吧。 KMP算法 KMP算法是一种线性时间复杂度的字符串匹配算法,它是对BF(Brute-Force,最基本的字符串匹配算法)的改进。对

ddyyxx的程序员之路 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

kmp算法详解

从头到尾彻底理解KMP 此文转自神的博客  http://blog.youkuaiyun.com/v_july_v/article/details/7041827# 作者:July 时间:最初写于2011年12月,2014年7月21日晚10点 全部删除重写成此文,随后的半个多月不断反复改进。后收录于新书《编程之法:面试和算法心得》第4.4节中。 1. 引言     本KMP原文最初写于2

楠先生 4万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

大话 KMP 算法

LeetCode上有一题,简单难度的,以下是原题 这个题目应该刷LeetCode的同学大部分都刷到过,比较荒谬的是可以直接用 indexOf 方法实现,并且是最优的解法,看到评论以后一片哗然,大家扯到最多的是这道题就应该用KMP来做,如果用KMP做那这道题应该是困难级别的。所以看了这些评论以后,决定自己去摸索一下KMP的算法,以及大概其实现原理。 网上找了很多关于解释KMP算法的...

lmx125254的博客 3833

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

kmp算法和kmp的优化

一、kmp是什么 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。 简单来...

harry12138小白的博客 1499
上一篇: Android屏幕适配
下一篇: 自定义View+五子棋的简单实现
凌小雪
博客等级 码龄12年 2粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值