首先是簡單的樸素匹配演算法
/*舉例說明:* 返回子串t在主串s的位置,若不存在則返回0
*/public
static
intindex(string s, string t)
}else
}if(j ==t.length())
return 0;
}
s是 abcabcabd t是 abcabd,樸素的匹配演算法每次發現不對都要重新回到上次匹配的首位,也就是要重新在s從找一次t的和第乙個字元匹配的字元。
但是像這個例子t字串中一開始就有ab後面也有ab,也就是說如果匹配到最後一位發現不匹配的時候,就可以直接進行到這裡
所以這就是kmp改進的地方,先自行處理一下t字串,找到t字串中與字首有重複的。建立乙個next陣列記錄下這個重複,就比如這個t匹配到最後乙個時發現s[5]和t[5]匹配失敗,但是t[3]t[4]和t[1]t[2]是重複的,所以這裡可以直接進行s[5]和t[3]的匹配。從**的角度講就是當i=5,j=5時,s[i]和t[j]匹配失敗,那就修改j跳過之前與t字串字首重複的。
這是乙個next陣列,這裡j=0時沒有字首所以在匹配的時候就應該重t[0]開始匹配,j=1時字首是a但是t[1]是b所以沒有重複,所以還是0,一直到j=3,a和字首a重複所以所以在匹配的時候就應該重t[1]開始匹配,到j=4,ab和字首ab重複所以所以在匹配的時候就應該重t[2]開始匹配,j=5的時候abd和字首abc並沒有重複所以應該重t[0]開始匹配。
再然後就是這個next陣列怎麼計算。。
宣告乙個k初始化為0用於記錄字首被重複的長度了,就比如t[3]和t[0]重複就記1,此時next相應的位置就是1(k),t[3]t[4]和t[0]t[1]重複就記2,此時此時next相應的位置就是2(k),t[3]t[4]t[5]t[0]t[1]t[3不]重複就置0。
整體**:
publicstatic
intkmpindex(string s, string t)
else
else
}else
else}}
}j = 0;
while(i < s.length() && j
}else
}if(j ==t.length())
return 0;
}
字串匹配的KPM演算法
轉至 字串匹配是計算機的基本任務之一。舉例來說,有乙個字串 bbc abcdab abcdabcdabde 我想知道,裡面是否包含另乙個字串 abcdabd 許多演算法可以完成這個任務,knuth morris pratt演算法 簡稱kmp 是最常用的之一。它以三個發明者命名,起頭的那個k就是著名科...
KPM匹配演算法
在第一次匹配中,i從0開始,j從0開始。當i 2,j 2時匹配失敗,此時i回溯到1,j回溯到0。第二次匹配中,i從1開始,j從0開始。當i 1,j 0時匹配失敗,此時i回溯到2,j回溯到0。第三次匹配中,i從2開始,j從0開始。當i 6,j 4時匹配失敗,此時i回溯到3,j回溯到0。第四次匹配中,i...
字串匹配演算法 字串匹配演算法總覽
字串匹配在文字處理裡非常重要,我們採用簡潔的python 把以下演算法一一實現並講解。樸素演算法 algorithm rabin karp 演算法 有限自動機演算法 finite automation knuth morris pratt 演算法 kmp algorithm boyer moore ...