KMP演算法(相關題目 leetcode28題)

2021-10-22 06:59:47 字數 1715 閱讀 3494

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個數,將大數放前,小數方後,依次直至比較最後兩個數。如此在第一輪最後的數必定是所有數中最小的,然後重複以上過程將所有小數放在最後...