KMP字串模式比對演算法(C++實現)

來源:互聯網
上載者:User

標籤:color   details   art   height   設定   detail   ++   計算   body   

鑒於原理有點複雜,詳細原理可以參考這篇文章http://blog.csdn.net/v_july_v/article/details/7041827

  本文直接從結論入手,應付考試和競賽足夠了。

  設T為目標串("aaabbbaabbabcabcabbaba"),pat為模式串("aabbabc")。

  這是模式串的next數組:

j(下標) 0 1 2 3 4 5 6
pat a a b b a b c
next[j] -1 0 1 0 0 1 0

  KMP演算法:

  j=0時,next[j]=-1。表示下一趟匹配比較時,模式串的第-1個字元與目標串上次失配的位置對齊。(其實等同於第0個字元與目標串上次失配的下一個位置對齊),模式串需要移動到posT-next[j]的位置。(posT為T串下標)

  j=1時,next[j]=0。表示下一趟匹配比較時,模式串的第0個字元與目標串上次失配的位置對齊。模式串需要移動到posT-next[j]個位置。

  j=2時,next[j]=1。表示下一趟匹配比較時,模式串的第1個字元與目標串上次失配的位置對齊。模式串需要移動到posT-next[j]個位置。

  以此類推......

  

  那麼下面只要求出next數組即可,next數組是如何形成的?

  從下標0開始,一直到lengthP-1為止(lengthP是模式串的長度),每次尋找該下標前面首碼與尾碼相同的最大長度(前尾碼不包括前面整個字串,即起始位置和終止位置都相等的那一個字串,下面有解釋)。

  j=0時,字元a前面無字元,故標記-1;

  j=1時,字元a前面有字元a,但由於“前尾碼不包括前面整個字串”的規則,所以並沒有相同的前尾碼一說,故標記為0。

  j=2時,字元b前面有字元aa,前尾碼相同的字串為a,故標記為前尾碼的長度1。

  以此類推......(PS:前尾碼的計算都是從左至右的)

  其實這樣說是為了方便理解next數組,而next數組的實際形成也是一次KMP演算法,它也是一個匹配字串的過程,用尾碼去匹配首碼的過程。

  代碼如下:

  

 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 string T; 5 string pat; 6 void getNext(int next[],int lengthP){//lengthP為模式串P的長度  7     int j=0,k=-1;//j為P串的下標,k用來記錄該下標對應的next數組的值  8     next[0]=-1;//初始化0下標下的next數組值為-1  9     while(j<lengthP){ //對模式串進行掃描 10         if(k==-1||pat[j]==pat[k]){//串尾碼與首碼沒有相等的子串或者此時j下標下的字元與k下的字元相等。 11             j++;k++; 12             next[j]=k;//設定next數組j下標的值為k 13         }else14             k=next[k];//縮小子串的範圍繼續比較 15     }16 }17 18 int kmp(int k,int next[]){19     int posP=0,posT=k;//posP和posT分別是模式串pat和目標串T的下標,先初始化它們的起始位置 20     int lengthP=pat.length();//lengthP是模式串pat長 21     int lengthT=T.length();//lengthT是目標串T長 22     while(posP<lengthP&&posT<lengthT){//對兩串掃描 23         if(posP==-1||pat[posP]==T[posT]){//對應字元匹配 24             posP++;posT++;25         }else26             posP=next[posP];//失配時,用next數組值選擇下一次匹配的位置 27     }28     if(posP<lengthP) return -1;29     else return posT-lengthP;//匹配成功 30 }31 32 int main(){33     T="aaabbbaabbabcabcabbaba";34     pat="aabbabc";35     int lengthP=pat.length();36     int next[lengthP]={0};37     getNext(next,lengthP);38     int pos=kmp(0,next);39     cout<<pos<<endl;40     cout<<"next[]:";41     for(int i=0;i<lengthP;i++){42         cout<<next[i]<<" "; 43     } 44     return 0;45 }

  

  

  

  

  

KMP字串模式比對演算法(C++實現)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.