数算第四章书面作业

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;i0&&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]合理

你可能感兴趣的:(数算第四章书面作业)