1. 簡單算法
如下圖例子舉例算法
簡單算法應當是,找到串1和中和串2第一個字母相同的,而後往下進行匹配,若是匹配不成功串1就回到此次匹配到的第一個相同字母的下一個字母進行匹配。這樣可能會致使不少的回溯。字符串
假如串1是: abcd abcd abcd abcd,那麼可能會致使原本長度是16,5的串要多掃描5×2×4遍。原理
KMP(Knuth-Morris-Pratt)im
KMP算法用於只有一個匹配字符串的時候可用,其原理是利用了須要匹配的串,這裏是串2自己的信息。在KMP算法中,如圖匹配到第五個字符的時候發現不對後並非如上面的普通算法那樣直接回到頭上,而是看串2中已經匹配到的部分有沒有首尾呼應的部分,如:「a b c a」 中頭尾上兩個a就同樣,這樣就串1就從e開始匹配,而串2就從b開始匹配。img
這樣作的好處,並非能夠節省串2的匹配,而是經過這樣子能夠不在串1上作回溯,也就是說,在已經匹配過的字符串裏,除了頭尾呼應的部分不可能再有屬於下個匹配字符串的部分。因此只須要識別出首尾呼應的字符串便可。時間
KMP算法的時間複雜度是O(m+n)。字符
BM(Boyer-Moore)ab
BM算法比較奇特的地方是從後面往前面匹配,即看串2中最後一個字母是否匹配。
只要最後一個字母不匹配,就能夠推斷當前串1中對應的子串和串2不同。而且當字母e和a不匹配的時候,串1中的字母e便被稱爲壞字符。對於壞字符的處理能夠分兩種狀況:
1)像下圖中所示,字母e不在串2中,因此能夠直接跳過這個字母,由於包含了這個字母子串都不可能和串2匹配。
2)該字母在串2中出現了,則將該字符匹配到串2中離末端最近的那個相同的字符上,假以下圖中字符e是a,則應該將串2右移一位,將串1的第五個字符對應上串2的第四個字符。
那若是最後一個字母匹配了呢?那就依次往前匹配。