#include <iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<stdio.h>
#include<cstring>
using namespace std;
//KMP算法
const int MAXN = 100;
int nextTable[MAXN];
void GetNextTable(string pattern){
int m = pattern.size();
int j = 0;
nextTable[j] = -1;
int t = nextTable[j];
while(j < m){
if(t == -1 || pattern[j] == pattern[t]){
t++;
j++;
nextTable[j] = t;
}else{
t = nextTable[t];
}
}
}
//KMP算法
int KMP(string text,string pattern){
GetNextTable(pattern);
int n = text.size();
int m = pattern.size();
int i = 0;
int j = 0;
while(i < n && j < m){
if(j == -1 || text[i] == pattern[j]){//如果通配符匹配成功或者两边字符匹配成功
i++;//继续下一组看是否匹配
j++;
}else{
j = nextTable[j];//匹配失败,向后跳跃到下一个可以开始尝试匹配的地方
}
}
if(j == m){
return i - j;//全部匹配成功,返回首地址
}else{
return -1;
}
}
int main()
{
string text,pattern;
cin>>text>>pattern;
int position = KMP(text,pattern);
cout<<position<<endl;
return 0;
}
KMP算法
最新推荐文章于 2023-04-09 17:43:52 发布