KMP模式串匹配

2022-03-03 23:07:43 字數 948 閱讀 4461

查詢在乙個很長n的「文字串」中,給定的很短m的「模式串」的出現有無,次數,位置

複雜度o(n+m) 而不是暴力的o(n*m)

這裡對模式串做了乙個神奇的移位法則,注意kmp是只針對模式串的操作,不是文字串

我喜歡把kmp叫做「對應的前一項字首位置」

例如:kmp記錄的是怎麼一回事,看圖看資料馬上就明白了

123123123923123123 ----模式串

000123456000123456 ----對應kmp陣列值

還有點模糊?

再來組資料

根據這兩張圖總結下:

1.由圖二可知,匹配基數為字串的所有字首(12,123均為字首)

2.由圖一二對比發現,如果字串出現與字首中斷匹配的部分,或者自己本身就是字首的話,那麼這些部分的kmp值全部為0

3.如果字串與字首匹配一直沒有發生中斷,那麼當前位置kmp值可以承接為離自己最近的字首kmp值

上**:

char

str[n];

cin>>str+1

;int j=0

;int len=strlen(str+1

);for(i,

2,len)

接下來直接和文字串匹配其實跟模式串內部匹配沒有實質區別:

char

text[n];

cin>>text+1

;j=0

;for(int i=1;i<=strlen(text+1);i++)

}

模式串匹配 KMP

樸素的的模式串匹配演算法通常要在向前移動文字指標之後,回溯模式串指標,其效率為o m n 而kmp演算法則挖掘了一些模式串中的一些資訊,來加快匹配的效率。kmp演算法的緊隨便是覆蓋函式next。當模式串p j 和文字串s i 失配時,j指標不是簡單的回溯,而是指向next j 覆蓋函式next如何定...

模式串匹配,kmp

include include include include define maxstrlen 255 可以在255以內定義最大串長 typedef char sstring maxstrlen 1 0號單元存放串的長度 void get next sstring t,int next void ...

kmp模式串匹配

作用 字串匹配 我們設匹配串為t,待匹配串為s,這個演算法的功能就是在指定s中,從s的第i位字元開始搜尋,判斷在s中是否有t存在。如果有則返回出現了t的首位字元位置 當然,這個陣列是從0開始 如果沒有則返回0。通過next陣列對匹配串t進行乙個預處理,我們獲得乙個next陣列。下面的描述 strin...