KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n) ----百度
应该是通过next[]数组实现
char str1[]="abcdacbdef"
char str2[]="abcd"
在str1中寻找子串str2,并返回一个数字。
该数字为从主串第几个字符开始找到子串。
在说KMP算法的时候,我们先了解一下暴力求解
暴力求解法的基本思路:
1.两个指针s1,s2分别指向str1,str2,通过s1,s2遍历数组。
2.在对应字符相同的情况下,s1,s2后移。
3.不相同的情况下,s1,s2需要回退到某个位置,重新匹配。
4.s2回退的位置很容易,就是str2,但是s1每次找到相同的字符,s1偏移后,指向已经改变了,我们需要在设置一个指针指向偏移后的起始位置。
C语言两种实现方式
#include<stdio.h>
#include<assert.h>
#include<string.h>
int ForceSearch(char* str1, char* str2)
{assert(str1 && str2);//断言,两个指针不能为空,为空报错//指针形式char* s1 = str1;//遍历搜寻char* s2 = str2;//遍历搜寻char* p = str1;//记录偏移后的起始位置while (*p){s1 = p;//回退到str1当前的起始位置s2 = str2;//回退到str2起始位置//*s2 !='