4.1
string A,B; //采用类似于kmp算法中求next数组的情况,只不过这次next数组保存的是最长前缀和后缀的值
int next[B.length()+1];
if(B[0]==A[0])
next[0]=1;//先初始化第一个值如果相同就l=1,否则l=0
else
next[0]=0;
int k=next[0];
int m=B.length();
for(int i=1;i<m;i++)
{
if(B[i]=A[k])//如果相等l值加1
next[i]=next[i-1]+1;
else//不相等就移位比较
{
while(k>0&&B[i]!=A[k])
{
k=next[k];
}
k++;
next[i]=k;
}
}
int result=next[B.length()-1];//最终结果就为next数组最后一个值
算法的复杂度为O(n)
4.2
非优化算法:
当p[k]=p[j]时,最长前缀和最长后缀都加一,next[i]=k+1正确;
若p[k]!=p[j],此时将p作为目标,第k个失配,便要将串向右移,让p[next[k]]来跟p[i]匹配,便是递归过程,直到二者相等或者k等于零
优化算法:
在非优化算法的基础上,若p[i]==p[k],在p[i]跟T[j]失配时,因为按照非优化算法,p需要右移使p[k]跟T[j]相匹配,但是由于p[i]等于p[k]所以p[k]必定失配,所以需要再右移使得p[next[k]]来配,故next[i]=next[k]合理
网友评论