開始複習演算法,複習到字串這一結構時,乙個經典的問題就是兩個字串的匹配問題。
比如:在主串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的第乙個字元,依次比較下去,直到得出最後的匹配...