1. 解決的問題:解決字串匹配問題。(換言之,判斷乙個字串「原串」裡面是否包含另乙個字串「模式串」)
2. 簡介: knuth-morris-pratt(簡稱kmp)演算法,是三個發明者名字首字母。
3. 舉例:原串 str = abafcdabafdcc,索引為 i,模式串 tar = abafd,索引為 j
這裡需要先說一下暴力演算法:
一直到第五個元素,發現不一樣,這時模式串整體後移移位,重新比較模式串的第乙個元素與原串的第二個元素是否一樣:
總結:以上就是暴力演算法,只要發現不一樣的字元,模式串就要整體後移移位,然後再從頭逐個比較,效率很低。kmp演算法是後移多位,然後從模式串的索引為 j 的字元繼續比較。
在說kmp演算法之前需要先了解幾個概念:字首、字尾、最大相等前字尾長度。
字首:除最後乙個字元的其他字元的組合。
字尾:除第乙個字元的其他字元的組合。
以abfab為例,
a的字首和a的字尾都是空集,所以最大相等前字尾長度為0;
ab的字首有:a;ab的字尾有:b;沒有交集,所以最大相等前字尾長度為0;
abf的字首有:a、ab;abf的字尾有:f、bf;沒有交集,所以最大相等前字尾長度為0;
abfa的字首有:a、ab、abf;abfa的字尾有:a、fa、bfa;交集是a,所以最大相等前字尾長度為1;
abfab的字首有:a、ab、abf、abfa;abfab的字尾有:b、ab、fab、bfab;
最後一行表示的是截止每個字元的字串的最大相等前字尾長度,我們使用乙個陣列next來儲存這些值。那麼abfab的next陣列就是
為什麼kmp演算法直接移動到這裡呢?這就是第乙個關鍵點:
移動位數 = j - next[j - 1],j = j - 移動位數;
**如下:
public static int strstr(string haystack, string needle)
} else else }}
return -1;
}
public static int getnext(string needle) else if(j == 0) else
}return next;
}
KMP演算法相關學習資料
kmp演算法 kmp演算法主要用於判斷字串f是不是另乙個字串o的子串。利用f串的next陣列或者nextval陣列可以實現效能的大幅度提高。主要有兩個步驟 1 對f串,求其next陣列或者nextval陣列,複雜度o m 2 將f串元素依次與o串元素比較,出現不匹配的元素,假設是f j 則將f串向前...
演算法 相關題目彙總(持續更新)
餘初學演算法,題目較易,望諸大神指正而勿噴。一 將乙個正整數分解質因數。例如 輸入90,列印出列印出90 2 3 3 5。static void main string args n 確保列印出 n for i 2 i n i i n i 將n整除i後的值繼續賦給n,來尋找下乙個質因數。如果不用整除...
排序演算法相關
1.1氣泡排序 氣泡排序的基本原理是 依次比較相鄰的兩個數,將大數放在前面,小數放在後面,也即首先比較第乙個和第二個數,將大數放在前面,小數放在後面。然後比較第2個數和第3個數,將大數放前,小數方後,依次直至比較最後兩個數。如此在第一輪最後的數必定是所有數中最小的,然後重複以上過程將所有小數放在最後...