字串匹配KMP演算法詳解。

2021-08-20 07:22:21 字數 1055 閱讀 5505

一、什麼是kmp演算法

·假設現在有這樣乙個問題:有乙個文字串s,和乙個模式串p,現在要判斷s中是否有和p匹配的子串,並查詢p在s中的位置,怎麼解決呢?

如果用暴力匹配的思路,並假設現在文字串s匹配到 i 位置,模式串p匹配到 j 位置,則有:

如果當前字元匹配成功(即s[i] == p[j]),則i++,j++,繼續匹配下乙個字元;如果匹配失敗(即s[i]! = p[j]),令i = i - j + 1,j = 0,即每次匹配失敗時,i 回溯到上次開始匹配的下乙個位置,j 被置為0。

理清楚了暴力匹配演算法的流程及內在的邏輯,咱們可以寫出暴力匹配的**,如下:

/**

2* 暴力破解法3*

4* @param

ss 主串5*

@param

ps 模式串6*

@return

如果找到,返回在主串中第乙個字元出現的下標,否則為-17*/

89public

intviolentmatch(string ss, string ps) else25}

26if (j ==p.length) else

31 }

暴力匹配演算法,實現字串匹配時間複雜度o(n+m)

b:km演算法實現。

之後每一位j的next求解: 

比較j-1字元與next[j-1]是否相等, 

如果相等則next[j]=next[j-1]+1, 

如果不相等,則比較j-1字元與next[next[j-1]]是否相等, 

1) 如果相等則next[next[j-1]]+1, 

2)如果不相等則繼續以此下去,直到next[…]=-1,則next[j]=0.

然而在演算法求解的時候,我們應該這樣去理解,求解下一位的next等於當前位與當前位的next比較。

php**實現:

<?php

function test()

function getnext($p,$next){

$next[0]=-1;

$k=-1;

$j=0;

while($j

字串匹配演算法 KMP詳解

這兩天在看字串匹配演算法,第一次看到kmp演算法的時候覺得很難。於是上網搜分析,網上講kmp的演算法很多,只是好像很多都講的雲裡霧裡的,不甚清晰。後來想想還是找教材看看,第一回看的是 演算法 第四版,其實沒看懂 於是再找來clrs看,恍然大悟,果然還是clrs 好。本文主要是梳理一下整個思路,盡自己...

字串KMP匹配演算法詳解

下面我再來舉個具體例子,並給出一具體執行程式 對於目的字串big是banananobano,要匹配的字串small是nano,的情況,下面是匹配過程,原理很簡單,只要先和big字串的第乙個字元比較,如果相同就比較下乙個字元 他們的第二個字元 如果不同就把small整體右移乙個,之後再從small的第...

KMP字串匹配演算法詳解

kmp演算法利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現乙個next 函式,函式本身包含了模式串的區域性匹配資訊。時間複雜度o m n 例如 第 j 1 個字元的next函式值next j 1 等於3,意味著它的前三個字串,s j 2 s j 1 s j...