推荐一个学习的地方 点击打开链接
时间复杂度O(n+m)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include <iostream>
#include <string>
using namespace std;
int Next[15000];
char s[100],p[100]; //s是字符串,a是模式串
int n,m; //n是s的长度,m是p的长度
void getNext(int m){ //得到Next表
int i=0,j=-1;
Next[0]=-1;
while(i < m){
if(j == -1 || p[i] == p[j])
Next[++i] = ++j;
else
j=Next[j];
}
}
//模式串当前字符与字符串不匹配时,模式串左移长度=已匹配长度-当前模式串匹配的字符的Next值
int Kmp(int n,int m){ //返回第一次匹配成功的字符串s的下标,否则返回-1
getNext(m);
int i = 0,j = 0;
while(i < n && j < m){
if(j == -1 || s[i] == p[j]){
i++;
j++;
}
else
j=Next[j];
}
if(j >= m) return i-m;
else return -1;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%s%s",s,p);
n=strlen(s);m=strlen(p);
int ans=Kmp(n,m);
printf("%d\n",ans);
}
return 0;
}