KMP字串匹配演算法

2021-07-03 02:26:32 字數 1145 閱讀 6684

給定字串a"abcaabcabb",模式串b"abcab"。求模式串第一次出現在給定字串中的索引,如果沒有則直接返回-1。

正常的解決方案是令i指向a中第乙個元素,將a中元素乙個乙個和b中元素比較,如果不相等,則i++,重頭再和b中元素比較。這一方案的時間複雜度為o(m*n),效率是較低的。

kmp演算法是解決字串匹配問題的乙個較優方案,演算法思想如下。

首先將a中元素和b中元素比較

當匹配到a中的b與b中的a不相同時,我們並不急著令i++再從頭比較。這裡有乙個基本資訊時從i所指向的a一直到b的前乙個元素d。a中"abca"這一段字串和b的字首是相同的。

因此實際上不需要i++我們也已經知道了i的下乙個元素就是"b",而且我們也可以提前知道"b"和b中的第乙個元素"a"是不等的。因此對於a來說"b"是可以跳過的,我們只需要在"abca"中找到乙個字尾和字首相同就可以了,這句話有點繞,其實就好比字串"abca"最長的相同字首和字尾是"a",那麼i直接跳到這個a就可以了,而且此時我們知道b的第乙個字元"a"是不需要比較的(因為必然和i指向的相同)

kmp演算法會提前算好模式串b中所有字元相對於字首的值next[i]。

設模式串為needle,得出next的**如下:

//計算模式串的相關最長相同字首

int next = new int[needle.length()];

next[0] = 0;

int a=1,b=0; //b表示字首中每乙個元素位置

for(;a

boolean flag = false;

int i=0;

int j=0;

while(i=haystack.length())

}elseelse

}

}if(flag)

return -1;

KMP演算法 字串匹配

kmp演算法基本思想 我們在用常規的思想做 字串匹配時候是 如 對如 字元如果 t abab 用p ba 去匹配,常規思路是 看 t 第乙個元素 a 是否 和p 的乙個 b 匹配 匹配的話 檢視各自的第二個元素,不匹配 則將 t 串的 第二個元素開始 和 p 的第乙個匹配,如此 一步一步 的後移 來...

KMP字串匹配演算法

kmp核心思想 計算模式串的next陣列,主串的索引在比較的過程中不回朔 ifndef kmp h define kmp h class kmp endif include kmp.h include include include using namespace std int kmp calcu...

KMP字串匹配演算法

在介紹kmp演算法之前,先介紹一下bf演算法。一.bf演算法 bf演算法是普通的模式匹配演算法,bf演算法的思想就是將目標串s的第乙個字元與模式串p的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和p的第二個字元 若不相等,則比較s的第二個字元和p的第乙個字元,依次比較下去,直到得出最後的匹配...