#include <iostream>
using namespace std;
void Next(char* s,int* next,int len)
{
/*
获得next数组其实相当于自身与自身做匹配。
初始i=0,j=-1;next[0]=-1;
在while中,if(j==-1 || s[i] = s[j])
当j=-1
1.第一次进入循环,j++,i++ 做s[0]与t[1]的比较
2.往后如若j=-1说明在s中当前比较的字符与模式串第一个字符还不相等
就要做i++ j++ 了. t要做下一个字符的比较了
在这里,一开始我总忘写 if j==-1 这个条件,导致错误
后来仔细看看,当再一次比较时(i > 0 && j > 0) 当比较不相等时, j = next[j]
在比较还是不相等 即 j = next[j]
在比较还是不相等 .....
..... ... .....
..... ... .....
在比较还是不想等 即 j = next[0] = -1
此时说明在模式串中再也找不到适合的next[j]了
所以在这里限制一个条件,当j==-1(也就是再也找不到适合的next[j])
,模式串和匹配串index都要后移一位 ,如果不加这个条件 当j==-1 会有边界溢出的错误
*/
int i=0,j=-1;
next[0] = -1;
while( i < len)
{
if(j == -1 || s[i] == s[j])
{
i++;
j++;
next[i] = j;
}
else
{
j = next[j];
}
}
}
int KMP(char* t,char* s,int* next)
{
int i = 0,j = -1;
int lent = strlen(t);
int lens = strlen(s);
while( i < lent && j < lens)
{
if( j == -1 || t[i] == s[j])
{
i++;
j++;
}
else
{
j = next[j];
}
cout<<i<<" "<<j<<endl;
}
if(j >= lens)
return i - lens + 1;
return -1;
}
int main()
{
char t[] = "acabaabaabcacaabc";
char s[] = "abaabcac";
int len = strlen(s);
int next[10];
Next(s,next,len);
cout<<" next:";
for(int i = 0; i < len; i++)
cout<<next[i];
cout<<endl;
cout<<t<<endl;
cout<<s<<endl;
int pos = KMP(t,s,next);
cout<<"位置:"<<pos<<endl;
return 0;
}
KMP 算法 字符匹配
最新推荐文章于 2023-10-15 23:04:56 发布