#include<bits/stdc++.h>
using namespace std;
int nextval[50];
int ans = 0, index1 = -1,flag = 0;
void getnextval(string s){//nextval[i]表示当i发生失配是应该退到模式串的最佳下标位置
int i = 0,j = -1;
nextval[0] = -1;
int len = s.length() - 1;
while(i < len){
if(j == -1 || s[i] == s[j]){//已知nextval[i] = j,s[i] == s[j] 如果next[i + 1] = j + 1;否则j = next[j];
++i;++j;
if(s[i] != s[j]) nextval[i] = j;//如果i发生失配,s[i]肯定不行,应该退回到j的位置,如果s[i]和s[j]相等的话那么j这个位置也是不行的,所以要找一个最佳位置,直接nextval[i] = nextval[j]
else nextval[i] = nextval[j];
}else{
j = nextval[j];
}
}
}
void kmp(string s, string t,int nextval[]){
int num = 1;
int i = 0,j = 0;
int lens = s.length();
int lent = t.length();
while(i < lens ){
if(j == -1 || s[i] == t[j]){
++i; ++j;
}
else{
j = nextval[j];
}
if(j >= lent){
if( !flag){
index1 = i - lent;
flag = 1;
}
ans++;
j = nextval[j];
}
}
}
int main(){
string s = "abababbab";
string t = "bab";
getnextval(t);
kmp(s,t,nextval);//匹配的起始位置
printf("下标:%d \n 成功匹配次数:%d\n",index1,ans);
}
KMP 返回第一次匹配成功首字符下标以及成功匹配次数
最新推荐文章于 2021-12-18 18:41:01 发布