字串匹配演算法KMP演算法

2021-09-20 13:53:19 字數 1757 閱讀 2638

資料結構中講到關於字串匹配演算法時,提到樸素匹配演算法,和kmp匹配演算法。

樸素匹配演算法就是簡單的乙個乙個匹配字元,如果遇到不匹配字元那麼就在源字串中迭代下乙個位置乙個乙個的匹配,這樣計算起來會有很多多餘的不符合的匹配做了冗餘的比較。假設源字串長n,字串長m 該演算法最差時間複雜度為 m*(n-m+1),記為o(n*m);這裡不做過多解釋樸素匹配演算法。

kmp演算法:

kmp演算法不是在源字串中下手,他是從字串下手,比如我要在源字串(acabaabaabcacaabc)中匹配乙個字串字串(abaabcac),那麼從字串abaabcac下手,分析字串時,需要借助於乙個陣列儲存字串中存在頭字串和尾字串對稱相等的子串長度,例如 abaabcac,

a  next[0] = -1,規定第乙個字元對應的next值為-1;

ab next[1] = 0; 因為針對字元b而言,其前邊字串a 不存在頭字串和尾字串對稱,所以為0;

aba next[2]=0 ; 因為針對子串 ab ,不存在頭字串和尾字串對稱,所以為0;

abaa next[3]=1 ; 因為針對子串aba ,存在 頭子串a和尾子串a對稱相等,其長度為1,所以為1;

abaab next[4]=1; 因為針對子串abaa ,存在 頭子串a和尾子串a對稱相等,其長度為1,所以為1;

abaabc next[5]=2; 因為針對子串abaab ,存在 頭子串ab和尾子串ab對稱相等,其長度為2,所以為2;

abaabca next[5]=0; 因為針對子串abaab ,,不存在頭字串和尾字串對稱,所以為0;

abaabcac next[6]=1; 因為針對子串abaabca,存在 頭子串a和尾子串a對稱相等,其長度為1,所以為1;

總結起來如下:

j            012

3456

7p a b a a b c a c

next(j) -100

1120

1

獲取next陣列的**如下

//

獲取模式匹配字串的next陣列

void getnext(char *str,char *next)

else k =next[k];}}

然後在匹配的過程中,如果遇到不匹配現象時,從不匹配位置分析,其next[i]的值標記著有n個頭子串和尾子串相等,即直接從next[i]的值為下標開始尋找匹配。複雜度為o(m+n)   kmp實現**:

//

src為要匹配的字串,pat為字串模型

int kmp(char *src,char *pat)

else

}if (pospreturn -1

;

else

return poss-lengthp;

}

完整的**:

#include#include

//獲取模式匹配字串的next陣列

void getnext(char *str,char *next)

else k =next[k];

}}//

src為要匹配的字串,pat為字串模型

int kmp(char *src,char *pat)

else

}if (pospreturn -1

;

else

return poss-lengthp;

}int

main()

字串匹配演算法 KMP演算法

kmp演算法是一種改進的字串匹配演算法。kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現乙個next 函式,函式本身包含了模式串的區域性匹配資訊。下面從乙個例子來了解kmp演算法 字串 bbc abcdab abcdabcdabde 我想...

字串匹配演算法(KMP演算法)

力扣 實現 strstr 函式。給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。int strstr char haystack,char needle else if j n len...

字串匹配演算法 KMP演算法

核心思想 kmp 演算法就是在試圖尋找一種規律 在模式串和主串匹配的過程中,當遇到壞字元後,對於已經比對過的好字首,利用字串的特點,盡可能多滑動幾位,提高效率 聽起來好像和bm演算法差不多 演算法講解 kmp演算法與bm演算法最大的不同在兩點 1 從前往後匹配 2 利用好字首的前字尾子串最長匹配規則...