版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yky__xukai/article/details/89512796
KMP算法-从入门到进阶
题目描述
给定一个文本串text和模式串pattern,从文本串中找出模式串第一次出现的位置
先来看最简单的方法,方便理解题目,也就是暴力求解
暴力求解
放大上面的图,得到下面这个。题目要求匹配到整个字符串,从开始匹配考虑。
用模式串的首元素去匹配文本串的每一个元素,如果能匹配到,则依次向后匹配,直到所有的模式串匹配成功。
如果模式串中有一个不匹配,则pattern回到首元素匹配test中的下一元素。
这里需要注意的是,模式串首元素需要匹配的最后一个元素是text-j,因为如果匹配到最后,模式串比text长是没有意义的。
整个流程,可以想象是先把模式串与text对齐,然后相对于text依次后移一位,拖动pattern,每次移动都比较整个pattern模式串每个元素(理解这个有助于后面分析)
#include <iostream>
using namespace std;
int main()
{
const char*s = "123456789";
const char*p = "678";
int a = 0;
int search(const char*s, const char*p);
a = search(s,p);
cout<<a<<endl;
return 0;
}
int search(const char*s, const char*p)
{
int i = 0;//用于标记匹配到text字符串的位置
int j = 0;//标记模式串中匹配的位置
int size = (int)strlen(p);
int nLast = (int)strlen(s) - size; //此处为匹配到text中最长位置
while((i <= nLast) && (j < size))
{
if (s[i+j] == p[j])
{
j ++;
}
else{
i++;
j = 0; //j回到模式串首元素
}
}
if(j >= size)
return i;
return -1;
}