擴展KMP算法(Extend KMP)
擴展kmp既是求模式串和主串的每一個后綴的最長公共前綴
即令s[i]表示主串中以第i個位置為起始的后綴,則B[i]表示s[i]和模式串的最長公共前綴
顯然KMP是求s[i]=模式串長度的情況,所以,擴展KMP是對KMP的拓展
像求KMP的next數(shù)組一樣,我們先求A[i],表示模式串的后綴和模式串的最長公共前綴
然后再利用A[i]求出B[i]
說明一下A的求法,B同理
現(xiàn)在我們要求A[i],且A[1]---A[i-1]已經(jīng)求出,設k,且1<=k<=i-1,并滿足k+A[k]最大
所以T[k]--T[k+A[k]-1]=T[0]--T[A[k]-1],推出T[i]--T[k+A[k]-1]=T[i-k]--T[A[k]-1]
令L=A[i-k],若L+i-1<k+A[k]-1,由A是最長公共前綴知A[i]=L,否則,向后匹配,知道字符串失配
并相應更新k
時間復雜度為線性O(m+n)
while(1+j<strlen(T)&&T[0+j]==T[1+j])
        j = j + 1;
 A[1]=j;
    int k=1;
    for(int i=2; i<strlen(T); i++)
    {
        int Len = k + A[k] - 1,L = A[i-k];
        if( L < Len - i + 1 )
            A[i] = L;
        else
        {
            j = max(0,Len -i +1);
            while(i+j<strlen(T)&&T[i+j] == T[0+j])
                j = j + 1;
            A[i] = j,k = i;
        }
    }
    j = 0;
    while(j<strlen(S)&&j<strlen(T)&&T[0+j]==S[0+j])
        j = j + 1;
    B[0] = j,k = 0;
    for(int i=1; i<strlen(S); i++)
    {
        int Len = k + B[k] - 1,L = A[i-k];
        if( L < Len - i + 1 )
            B[i] = L;
        else
        {
            j = max(0,Len -i +1);
            while(i+j<strlen(S)&&j<strlen(T)&&S[i+j] == T[0+j])
                j = j + 1;
            B[i] = j,k = i;
        }
    }
 ps:普通的next是到這個結(jié)尾的,能和模式串匹配的長度,擴展kmp是以這個開頭的能匹配的最大長度
pss:然后我簡單比較了下kmp和擴展kmp http://www.isnowfy.com/kmp-and-extend-kmp/
您可能感興趣的文章
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
 - 01-10深入第K大數(shù)問題以及算法概要的詳解
 - 01-10深入N皇后問題的兩個最高效算法的詳解
 - 01-10用C++實現(xiàn)DBSCAN聚類算法
 - 01-10深入全排列算法及其實現(xiàn)方法
 - 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
 - 01-10貪心算法 WOODEN STICKS 實例代碼
 - 01-10輸出1000以內(nèi)的素數(shù)的算法(實例代碼)
 - 01-10快速模式匹配算法(KMP)的深入理解
 - 01-10海量數(shù)據(jù)處理系列之:用C++實現(xiàn)Bitmap算法
 


閱讀排行
本欄相關
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
 - 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
 - 04-02c語言的正則匹配函數(shù) c語言正則表達
 - 04-02c語言用函數(shù)寫分段 用c語言表示分段
 - 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
 - 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
 - 04-02c語言沒有round函數(shù) round c語言
 - 04-02c語言分段函數(shù)怎么求 用c語言求分段
 - 04-02C語言中怎么打出三角函數(shù) c語言中怎
 - 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
 
隨機閱讀
- 01-10使用C語言求解撲克牌的順子及n個骰子
 - 08-05DEDE織夢data目錄下的sessions文件夾有什
 - 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 01-10delphi制作wav文件的方法
 - 01-10SublimeText編譯C開發(fā)環(huán)境設置
 - 08-05織夢dedecms什么時候用欄目交叉功能?
 - 01-11ajax實現(xiàn)頁面的局部加載
 - 01-10C#中split用法實例總結(jié)
 - 04-02jquery與jsp,用jquery
 


