#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std;
int next[100];//下标从1开始
string T;//主串
string P;//模式串
void initial()
{
memset(next,0,sizeof(next));
T.clear();
P.clear();
}
//得到next数组 ,完全按照课本的定义来。
void get_next()
{
next[0]=-1;
int k=-1,j=0;
while(j<P.length()-1)
{
if(k==-1||P[j]==P[k])
{
k++; j++;
next[j]=k;
}
else
k=next[k];
}
}
//返回匹配位置 ,如果不存在返回-1
int kmp_search()
{
//i 是主串的下标,j是模式串的下标。
int i=0,j=0;
while(i<int(T.length())&&j<int(P.length()))
{
//如果下标对应的字母相等,那都向后移一个位置
if(j==-1||T[i]==P[j])
{
i++;j++;
}
else
//如果不相等,那么j应该跳转到next[j]这个地方
j=next[j];
}
//经过这个 while循环,i和j有三种情况:
//1.i到尾j没有到 2.i没到尾j到尾 3.i和j同时到尾
//所以有以下判断
if(j==P.length())
return i-j;
else
return -1;
}
int main()
{
initial();
cin>>P;
get_next();
cin>>T;
cout<<"在第"<<kmp_search()+1<<"个字符的位置出现匹配串"<<endl;
}
kmp
最新推荐文章于 2023-06-28 23:43:43 发布