最頭痛這個算法了 加上kmp 都學習了接近一個星期都不會 現在勉勉強強可以將模板打出來
辛苦辛苦,雖然菜,但還是要學會的。
過程:http://blog.csdn.net/Littlewhite520/article/details/77427017
圖片參考博客 :https://www.61mon.com/index.php/archives/186/
這個是求解next數組 和extend數組
#include<iostream>
#include<string.h>
using namespace std;
string s,t;
int nt[1000],extend[1000];
int n,m,i,j;
void get_next(string &t,int nt[])
{
int a=0,p=0;// a是用來紀錄上一個點的匹配的公共綴 p爲當前字符的最遠的匹配的下標
nt[0]=m; //第一個元素的值設置爲m總長度
for(i=1;i<m;i++)
{
if(i>=p||i+nt[i-a]>=p) //當i大於p時 或者
{
if(i>=p) p=i;//p如果小於i p只能從i處開始
while(p<m&&t[p]==t[p-i]) p++;//意思就是將主串t的第i個開始匹配 t從0開始的字符串 因此需要用t[p]和t[p-i]比較是否相等 若相等則將p最遠距離拉遠可以得到當前字符的與t串的最長公共前綴長了
nt[i]=p-i; //意思從當前i位置匹配了幾個與t串的相同的前綴
a=i;
}
else nt[i]=nt[i-a];
}
}
void get_extend(string &s,string &t,int extend[],int nt[])
{
int a=0,p=0;
get_next(t,nt);
for(i=0;i<n;i++){
if(i>=p||i+nt[i-a]>=p)
{
if(i>=p) p=i;
while(p<n&&p-i<m&&s[p]==t[p-i]) p++;
extend[i]=p-i;
a=i;
}
else extend[i]=extend[i-a];
}
}
int main()
{
while(cin>>s>>t)
{
n=s.size(),m=t.size();
get_extend(s,t,extend,nt);
cout<<"next數組:"<<endl;
for(i=0;i<m;i++)
cout<<nt[i]<<" ";
cout<<endl<<"擴展kmp數組:"<<endl;
for(i=0;i<n;i++)
cout<<extend[i]<<" ";
}
return 0;
}