字符串模式匹配KMP

主串S: [0...n-1]
模式串T: [0...m-1]
模式匹配:返回模式串在主串中的位置

蛮力法

int IndexMatch(char s[],char t[])
{
    int n=strlen(s);
    int m=strlen(t);
    for(int i=0;i<=n-m;i++)
    {
        int j=0;
        while(j

简单模式匹配算法的最坏时间复杂度为O(nm).

KMP算法

kmp算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。每当一趟匹配过程中出现字符不相等时,不需要回溯 i 指针,而是通过修改 j 指针,将模式串向右尽可能远的滑动一段距离,继续进行比较。具体就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。
kmp算法通过一个O(m)的预处理,是匹配的时间复杂度降为O(n+m).

详细推导过程可参考博客:https://www.cnblogs.com/yjiyjige/p/3263858.html

next[j]表示当S[i] != T[j] 时,模式串中需要重新和主串匹配的位置。

#include
#include
using namespace std;

const int N=100000;
int Next[N];
char s[N],t[N];
int slen,tlen;

//next[j]表示当s[i]!=t[j]时,模式串t中需要重新和主串匹配的位置
void makeNext()
{
    int j,k;
    j=0, k=-1;
    Next[0]=-1;
    while(j0 && s[i]!=t[j])
        {
            j=Next[j];
        }
        if(s[i]==t[j])
            j++;
        if(j==tlen)
        {
            ans++;
            j=Next[j];
        }

    }
    return ans;
}

int main()
{
    cin>>s>>t;
    slen=strlen(s);
    tlen=strlen(t);
    makeNext();
    cout<<"模式串在主串中首次出现的位置:"<

你可能感兴趣的:(字符串模式匹配KMP)