字串匹配KMP演算法實現

來源:互聯網
上載者:User

標籤:kmp演算法   最佳化   

由於KMP演算法比較難,所以建議初學者分兩個階段學習。

第一個階段先理解演算法思想,可以參考這篇文章:點擊開啟連結

第二個階段,理解演算法的具體實現,本文主要講解這部分,需要注意的地方都在程式裡了,自己看吧


程式(調試通過):

#include <stdio.h>#include <string.h>int KMP(char* s, char* pattern, int start, int next[]);void get_new_next(char* pattern, int next[]);int main(){    int n;    char* s= "lakgjkaglamdaltjie";    char* pattern= "lamd";    int next[5];    //長度為strlen(pattern)+1    int start = 0;  //從start處開始搜尋字串s    get_new_next(pattern, next);    n = KMP(s, pattern, start, next);    printf("%d\n",n);    return 0;}//返回pattern在字串s中匹配的第一個位置,例如:本例返回3int KMP(char* s, char* pattern, int start, int next[]){    int i = start, j = 1;    while (i<=(int)strlen(s) && j<=(int)strlen(pattern))    {        if(j==0 || s[i]==pattern[j-1])  //找到第一個匹配的字元,然後每次移動1位繼續匹配        {            i++;            j++;        }        else            j = next[j];    //匹配失敗,則尋找部分匹配表,移動若干位    }    if(j>(int)strlen(pattern))        return i-strlen(pattern)+1;    else        return -1;  //Not found}//最佳化後的get_new_next函數(構造next[]的部分匹配表)void get_new_next(char* pattern, int next[]){    int k=-1,j=0;    next[0]=-1;    while (pattern[j]!='\0')  //迴圈直到pattern遇到結束符    {        //如果j的前面k個字元與開頭的k個字元不相等        while(k!=-1 && pattern[k]!=pattern[j])            k = next[k];        j++;        k++;        //如果j的前面k個字元與開頭的k個字元相等        if(pattern[k] == pattern[j])            next[j] = next[k];        else            next[j] = k;    //pattern[k]!=pattern[j](1<=k<j)    }}


字串匹配KMP演算法實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.