KMP演算法的基礎應用

2021-10-12 10:51:54 字數 1563 閱讀 5020

本篇部落格**於內容中含有大量原文,僅是本蒟蒻的一篇筆記

kmp演算法指的是字串模式匹配演算法,問題是:在主串t中找到第一次出現完整子串p時的起始位置。該演算法是三位大牛:d.e.knuth、j.h.morris和v.r.pratt同時發現的,以其名字首字母命名。本篇部落格講介紹kmp演算法的最基礎應用。

一般字串匹配問題的解法:

對於這種字串匹配問題,通常的思路是乙個乙個字母的匹配直到完全重合,如果不匹配則將下面的關鍵字向右移動一位,直到遍歷所有或者找到完全匹配的字串。

顯然這很暴力。比如,對於串「ssssssssss」和串「sb」來講,我們要找到最後才能得到答案,即沒有與之匹配的串。大牛忍受不了這種低效暴力的演算法,一起研究出了kmp演算法,整個演算法的核心就是利用已經「部分匹配」的資訊,更快找到答案。所以,整個kmp的重點就在於當某乙個字元與主串不匹配時,我們應該知道j指標要移動到哪?

接下來我們自己來發現j的移動規律:

如圖:c和d不匹配了,我們要把j移動到哪?顯然是第1位。為什麼?因為前面有乙個a相同啊:

如下圖也是一樣的情況:

可以把j指標移動到第2位,因為前面有兩個字母是一樣的:

至此我們可以大概看出一點端倪,當匹配失敗時,j要移動的下乙個位置k。存在著這樣的性質:最前面的k個字元和j之前的最後k個字元是一樣的。如果用數學公式來表示是這樣的

p[0 ~ k-1] == p[j-k ~ j-1]

該規律是kmp演算法的關鍵,kmp演算法是利用待匹配的子串自身的這種性質,來提高匹配速度。該性質在許多其他中版本的解釋中還可以描述成:若子串的字首集和字尾集中,重複的最長子串的長度為k,則下次匹配子串的j可以移動到第k位(下標為0為第0位)。我們將這個解釋定義成最大重複子串解釋。

這裡面的字首集表示除去最後乙個字元後的前面的所有子串集合,同理後綴集指的的是除去第乙個字元後的後面的子串組成的集合。舉例說明如下:

在「aba」中,字首集就是除掉最後乙個字元』a』後的子串集合,同理後綴集為除掉最前乙個字元a後的子串集合,那麼兩者最長的重複子串就是a,k=1;

在「ababa」中,字首集是,後綴集是,二者最長重複子串是aba,k=3;

在「abcabcdabc」中,字首集是,後綴集是,二者最長重複的子串是「abc」,k=3;

KMP演算法的擴充套件應用

這一篇介紹一下關於經典的字串匹配演算法kmp的擴充套件應用 在原始串的後面新增最少的字元生成乙個長字串,使長字串包含兩個原始串 時間複雜度 o n author lwl2020 date 2020 5 29 description 在原始串的後面新增最少的字元生成乙個長字串,使長字串包含兩個原始串 ...

KMP演算法及其應用

今天學習了乙個新演算法 kmp演算法 其實很久以前學過早忘了 kmp演算法是用於處理字串問題的演算法。參考matrix67的部落格 kmp演算法詳解 matrix67 假設有字串a和b,要求判斷b是否是a的字串 其實就是對於每個i,求最大的j,使得ai j 1 i與b 1 j 一一匹配 能匹配j指標...

KMP演算法及應用

kmp演算法用來解決一系列字串單模式匹配問題,其以難理解,難記憶著稱。其next陣列的構造就如同ac自動機中的fail指標,就是如果匹配失敗,字串應從 開始繼續匹配。這裡的next陣列表示 next i 前i個字元的公共最長前字尾長度。覺得對於kmp演算法,這篇寫的不錯 現在來講一下應用。給定兩個字...