kmp匹配暴力

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/yky__xukai/article/details/89512796