KMP:无非就是求两种东西:1. next数组 。2.KMP匹配
思路:求next数组,可以认为是对子字符串*2(也可以理解为自我匹配)进行求对应位置的相同的抽象化,在比对的过程中分为两种可能,1.匹配成功 则进行 指针++ 2.匹配不成功 则进行回退操作(假如 k是最初指向 -1的指针)回退操作为:k=next[k];
求kmp,思路和求next极其相似,求取next数组是两个相同的字符串进行比较,而kmp则是 匹配两个不同字符串,并且需要通过子字符串求出的next数组进行对子字符串的回退(这里又提到了回退)。
#include <bits/stdc++.h>
using namespace std;
string far,son;
int next[1000];
void getnext(){
int j=0,k=-1,len=son.size();
next[0]=-1;
while(j<len){
if(k==-1||son[j]==son[k])//from begin start,if equal,willoperat
next[++j]=++k;
else
k=next[k];//if else not equal ,will return less lacation
}
}
int KMP(){
int i=0,j=0,len1=far.size(),len2=son.size();
while(i<len1){
if(j==-1 ||far[i]==son[j]){
++j,++i;
}
else
j=next[j];
if(j==len2)//just meet the conditions
return 1;
}
return 0;
}
int main(){
cin>>far>>son;
getnext();
if(KMP())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}