一、什麼是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。
理清楚了暴力匹配演算法的流程及內在的邏輯,咱們可以寫出暴力匹配的**,如下:
/**暴力匹配演算法,實現字串匹配時間複雜度o(n+m)2* 暴力破解法3*
4* @param
ss 主串5*
@param
ps 模式串6*
@return
如果找到,返回在主串中第乙個字元出現的下標,否則為-17*/
89public
intviolentmatch(string ss, string ps) else25}
26if (j ==p.length) else
31 }
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...