约定 txt 是 主字符串 ,pat 是 模式串;
假设 pat = "ABABABC" ; txt="ABAABBABABABCA";
`ABABABABABABCA
`ABABABC
`ABABABC
`ABABABC
...........
依次对其并且依次比较 TLE 了;so 需要 improve ~
ABABABABABABCA
ABABABC
|
如果在 | 这个位置比较的话 那么ABABABABABABCA
ABABABC
|
pat可以往后移动2单位 优化了诶~ // 向后移动所能移动的max位移,,
所以我们要做的就是
get 一个 next[] 来确定
在pat 第 i 位匹配不成功的话
需要 从第pat の 第 next[i] 位置 重新匹配
· getnext(string pat)代码实现:
int* getnext(string pat)
{
int *next=new int [pat.length()];
next[0]=-1;
int i=0,k=-1;
while(i<pat.length())
{
if(k==-1||pat[i]==pat[k])
{
k++;
next[++i]=k;
}
else
k=next[k];// 需要 从第pat の 第 next[i] 位置 重新匹配
}
for(int i=0;i<pat.length();i++)
{
cout<<next[i]<<" ";
}
return next;
}
在得知
在pat 第 i 位匹配不成功的话
需要 从第pat の 第 next[i] 位置 重新匹配
之后就可以开始匹配txt了
int KMP(string txt,string pat)
{
int *next=getnext(pat);
int i=0;
int j=0;
while(i<txt.length()&& j<pat.length())
{
if(j==-1||pat[j]==txt[i])
{
j++;i++;
}
else
j=next[j];
}
if(j>=pat.length())
{
cout<<"在txt中找到了pat!!"<<endl;
cout<<"位置是"<<i-pat.length()<<endl;
}
}
KMP完成:
完整代码测试-》
#include<iostream>
using namespace std;
int* getnext(string pat)
{
int *next=new int [pat.length()];
next[0]=-1;
int i=0,k=-1;
while(i<pat.length())
{
if(k==-1||pat[i]==pat[k])
{
k++;
next[++i]=k;
}
else
k=next[k];
}
for(int i=0;i<pat.length();i++)
{
//cout<<next[i]<<" ";
}
return next;
}
int KMP(string txt,string pat)
{
int *next=getnext(pat);
int i=0;
int j=0;
while(i<txt.length()&& j<pat.length())
{
if(j==-1||pat[j]==txt[i])
{
j++;i++;
}
else
j=next[j];
}
if(j>=pat.length())
{
cout<<"在txt中找到了pat!!"<<endl;
cout<<"位置是"<<i-pat.length()<<endl;
}
}
int main()
{
KMP("ABABABABABABCA","ABABABC");
return 0;
}