字串匹配 KMP演算法的Java實現

2021-08-11 05:03:18 字數 1450 閱讀 1669

開始複習演算法,複習到字串這一結構時,乙個經典的問題就是兩個字串的匹配問題。

比如:在主串ssdfgasdbababa中找是否存在乙個asdba的子串。

用傳統的方法就是暴力匹配,從主串中乙個個地和子串匹配。

最壞的情況下,就是匹配到最後一步才得到結果。

其時間複雜度為o((m-n)*n),其中主串的長度為m,子串的長度為n。

以下為自己的理解,表達上難免有些口語化:)

kmp演算法的核心思想就是:如果a==b,b!=c,那麼a必然不等於c!,這樣一來就省掉了比較a和c的步驟。

kmp的大致思想就是:利用乙個next陣列,儲存子串中每個字元前面的字首和字尾的最大相同匹配長度,為了在與主串匹配時,如果存在相同的部分,就可以通過next陣列來「跳過」已經相同的部分,省掉一些匹配操作。

如果想看詳細解釋,推薦另一篇部落格:kmp演算法最淺顯理解——一看就明白,不過提醒下這篇是基於c++實現的,不過原理講的挺好的。

在kmp演算法上分兩部分:一部分是計算next陣列,另一部分就是子串和主串匹配。其實兩者實現原理是一致的。

計算next陣列

首先計算子串的next陣列

在這裡要解釋下,不同版本的kmp演算法雖然原理一樣,但是各自對next的值有不同的理解,在這裡說明一下,next陣列中:

public

static

int calnext(string str)

if (str.charat(q)==str.charat(j))

next[q] = j;

}return next;

}

利用next陣列,匹配主串和子串

kmp主方法思想和上面求next陣列思想是一致的,只不過乙個是串內匹配,這個是兩個串之間匹配。

直接上**:

//str為主串,dest為子串,next為上面得到的next陣列

public

static

int kmp(string str, string dest, int next)

if(str.charat(i)==dest.charat(j))

if(j == dest.length())

}return -1; //如果找不到匹配,返回-1

}

主程式

最後就是在主程式中呼叫了。

public

static

void

main(string args)

當時理解kmp演算法還是有點繞,稍微有些難度(原諒我演算法基礎不咋樣~)

最後說一下,kmp演算法在字串存在部分匹配才會體現它的效率,否則和一般方法區別不大。

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的第乙個字元,依次比較下去,直到得出最後的匹配...