KMP算法

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

写在前面:

        模式串下标从0开始,next数组和nextval数组从-1开始;

        例如:

                            abcabd        aaaaaaab

         next          -100012        -10123456

         nextval     -100002        -10000006


代码:

        普通KMP (时间复杂度 O(n + m))

#include <stdio.h>
#include <string.h>
#define N 100

void Get_Next(char t[], int len);
int KMP(char s[], char t[], int lens, int lent);

int next[N];

int main()
{
	char s[N], t[N];
	scanf("%s%s", s, t);
	Get_Next(t, strlen(t));
	int start = KMP(s, t, strlen(s), strlen(t));
	printf("%d\n", start);

	return 0;
}

int KMP(char s[], char t[], int lens, int lent)
{
	int i = 0, j = 0;
	while(i < lens && j < lent){
		if(j == 0 || s[i] == t[j]){               //虽然next是从-1开始,但这儿j最小为0
			i ++;
			j ++;
		}
		else{
			j = next[j];
		}
	}

	if(j == lent) return i - lent;
	else return -1;
}

void Get_Next(char t[], int len)
{
	int i = 0, j = -1;
    next[0] = -1;
    while(i < len){
        if(j == -1 || t[i] == t[j]){
			/* j == -1 表示当前next[i]保持初始值(0)不变,然后next[i+1] = 0; 
			next[i] = j 指 t[i-j+1...i-1] == t[0...j];					*/
            i ++;
            j ++;
            next[i] = j;
        }
        else
			j = next[j];
    }
}

        优化的KMP (时间复杂度 O(m))

#include <stdio.h>
#include <string.h>
#define N 100

void Get_NextVal(char t[], int len);
int KMP(char s[], char t[], int lens, int lent);

int nextval[N];

int main()
{
	char s[N], t[N];
	scanf("%s%s", s, t);
	Get_NextVal(t, strlen(t));
	int start = KMP(s, t, strlen(s), strlen(t));
	printf("%d\n", start);

	return 0;
}

int KMP(char s[], char t[], int lens, int lent)
{
	int i = 0, j = 0;
	while(i < lens && j < lent){
		if(j == 0 || s[i] == t[j]){
			i ++;
			j ++;
		}
		else{
			j = nextval[j];
		}
	}

	if(j == lent) return i - lent;
	else return -1;
}

void Get_NextVal(char t[], int len)
{
	int i = 0, j = -1;
	nextval[0] = -1;
	while(i < len){
		if(j == -1 || t[i] == t[j]){
			i ++;
			j ++;
			if(t[i] != t[j]) nextval[i] = j;
			else nextval[i] = nextval[j];
		}
		else
			j = nextval[j];
	}
}


KMP 算法 KMP 阅读详情

相关推荐

kmp算法.ppt

kmp算法的原理以及kmp算法的源代码

kmp算法总结

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

ddyyxx的程序员之路 1万+

严蔚敏-数据结构-kmp算法详解.ppt

严蔚敏-数据结构-kmp算法详解.ppt该文档详细且完整,值得借鉴下载使用,欢迎下载使用,有问题可以第一时间联系作者~

大话 KMP 算法

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

lmx125254的博客 3833

【origin】负载牵引的Smith圆图

export导出为txt,得到的是幅相值,复制到excel如下图,有多根类似格式的线,只需要复制DE列到origin中。回到sheet,发现新增了选中的一组值,就是解释过后的值。笔者没找到把所有线一起画出的方法,只能蠢一点,一组一组画。而且,箭头所指的位置都变成了Y轴(应该要为X轴)以此类推,把之后的曲线都画完,可以汇总到一个图中。显示以下界面,点击右上圆图,选择解释。会生成新的graph,再重新解释一次。选择第二组线,同样画smith圆图。选中第一组线,选smith圆图。复制到origin,如下图。

乾巽的博客 2920

别再为SCI论文配图发愁了!手把手教你用PS+AI搞定从数据图到模式图的全流程

本文详细解析了如何利用Photoshop(PS)和Illustrator(AI)高效完成SCI论文配图的全流程,涵盖数据可视化、模式图设计及期刊适配性输出。通过实战案例,帮助科研人员掌握位图与矢量图的处理技巧,提升论文配图质量,满足不同期刊的出版要求。

weixin_28630185的博客 382

kmp算法和kmp的优化

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

harry12138小白的博客 1498

Cursor使用教程,有点难

Cursor Code Editor 不仅仅是一个代码编辑器,它更是一个集成了 AI 的全功能开发环境,帮助你从代码编写到优化的整个过程变得更加智能和高效。它通过内置的 AI 代码补全、错误检测和自动修复功能,大大减少了手动编写代码的负担,帮助你快速完成开发任务。同时,Cursor 还与多种前沿的 AI 大模型集成,包括 OpenAI 的 GPT-4o、Claude 3.5 和 Meta 的 Llama 3.1。

xiaofeitunAI的博客 1万+

【算法】KMP 算法

本文介绍字符串的模式匹配算法之一——KMP 算法,包括其概述、代码实现等。

代码星辰的博客 1448

UE5.3像素流送Docker化部署:从Linux服务器搭建到云端实时渲染

本文详细介绍了在Linux服务器上使用Docker容器化部署UE5.3像素流送服务的完整流程。通过将虚幻引擎运行时、信令服务器和TURN服务打包为标准化镜像,利用Docker Compose进行编排,实现了云端实时渲染应用的快速部署、环境一致与弹性扩展,有效解决了传统部署中的环境依赖与运维难题。

k0l1m2n3o的博客 200

基于改进YOLO11的天际线检测算法:复杂光照与恶劣天气适配实战

针对特定任务的YOLO改进,不应追求通用SOTA,而应深入理解任务的物理退化机理。Retinex对应光照模型、FAD对应散射模型、Wise-IoU对应边界不确定性——每个改进都有明确的物理解释,而非盲目的模块堆叠。时序一致性:引入轻量级RNN/Transformer模块利用视频帧间信息补偿单帧退化;多模态融合:结合红外/NIR波段穿透雾霾,与可见光特征在FAD-Neck中交叉注意力融合;自监督预训练:在海量无标注天际线视频上用MAE预训练Backbone,缓解恶劣天气标注稀缺问题。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 95

算法 kmp算法

kmp算法是改进后的字符匹配算法,它与bf算法的区别是,每次从串与主串匹配失败后,从串与主串匹配的位置不同。下面具体说下这两种算法的区别:主串:BABCDABABCDABCED从串:ABCDABCEDBF算法:第一步:BABCDABABCDABCEDA               从主串的第一个字符位置开始与从串第一个字符位置进行匹配,匹配失败第二步:BABCDABABCDABCED ABCDAB...

夜雨柠檬 833

RK3399快速上手 | 01- 开发环境搭建(固件烧写、编译工具链安装、kernel编译)

一、编译工具链 编译工具链使用gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu。 下载地址: https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabihf/ wget https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabi

Mculover666的博客(嵌入式) 8836

KMP及KMP改进算法

kmp”看毛片“算法确实很难理解,上网搜了半天想了很久才大概想明白。KMP算法精华在于next数组: "部分匹配值"即next数组就是"前缀"和"后缀"的最长的共有元素的长度。以"ABCDABD"为例, 首先看看 next 数组值的求解方法 。             例如:   模式串 abaabcac      next 值 01122312      ne

memmorryy的专栏 1446

MoCap 动作捕捉开源库教程

数据通过 tf2 和支持不同 QoS 设置的 /poses 主题直接发布。该软件包最初是为 Crazyswarm 开发的,用于跟踪多达 50 个飞行机器人。

机器人控制与仿真应用 1307

一个非常简单的变分量子分类器 (VQC)

​ 在之前的帖子(这里和这里)中,我已经开始谈论 QML,为什么以及如何学习,从现在开始,我将开始分享我的研究和发现,到目前为止,这些都是非常基本的。​

gongdiwudu的专栏 6208

BF算法、KMP算法、改进的KMP算法

BF算法、KMP算法、改进的KMP算法,以上几种算法都是模式匹配算法,即找模式串在主串中第一次出现的位置。 BF算法: 如上图所示 主串:”abcaba”   子串:”aba” 思路:从主串第一个开始和子串第一个匹配,如果相等则两个串都向后走一步,继续匹配。如果不相等则主串从i-j+1开始、子串从头开始重新匹配。可以看到每当失配时,主串的i需要从开始匹配的下一个字符开始,重新和子串开始匹...

ShWe的博客 2921

廖雪峰Python教程[完整版]

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

上一篇: NYOJ-38 布线问题(图论,最小生成树,Prime)
下一篇: NYOJ-42 一笔画问题(图论,深搜)
tbl00c
博客等级 码龄13年 21粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值