KMP字符串匹配算法

在处理字符串的过程中,我们常常会遇到字符串的匹配问题,例如找一个串在另一个串中是否出现,出现了几次,在哪些位置出现等等。其中,我们称主串为“文本串”(text),称需要在主串中寻找的子串为“模式串”(pattern)。举个例子,假如要在“aababababc”中查找串“abab”,那么“aababababc”就是文本串,“abab”就是模式串。

对于这类问题,暴力解法就是枚举模式串在文本串中的起始位置,然后逐一匹配,完全匹配就说明找到了。代码如下

int l1=text.size(),l2=pattern.size();
for(int i=0;i<l1-l2+1;i++)
{
    bool flag=false;
    for(int a=i,b=0;b<l2;a++,b++)
        if(text[a]!=pattern[b])
        {
            flag=true;
            break;
        } 
    if(!flag) printf("在文本串的第%d个位置找到了一个模式串\n",i);
}

不难看出,这样的时间复杂度是O(nm)的,而KMP算法能在O(n+m)的时间内解决这一问题(n和m分别是文本串和模式串的长度)。

猜你喜欢

转载自www.cnblogs.com/wozaixuexi/p/8975212.html