kmp算法

精華之處:求next數(shù)組(自動(dòng)機(jī))

KMP與getNext方法相同,只有?next[suffix] = prefix;? //1不同

next數(shù)組求解方法:

1.覆蓋表:求前綴、后綴公共部分最大長度

2.next數(shù)組為覆蓋表右移一位。

public class KMP {

? ? public static int KMP(String s, String t) {

? ? ? ? int i = 0;

? ? ? ? int j = 0;

? ? ? ? //得到next數(shù)組

? ? ? ? int[] next = getNext(t);

? ? ? ? while (i < s.length() && j < t.length()) {

? ? ? ? ? ? if (j == -1 || s.charAt(i) == t.charAt(j)) {

? ? ? ? ? ? ? ? i++;

? ? ? ? ? ? ? ? j++;

? ? ? ? ? ? }else {

? ? ? ? ? ? ? ? //根據(jù)next數(shù)組的指示j進(jìn)行回溯,而i永遠(yuǎn)不會(huì)回溯

? ? ? ? ? ? ? ? j = next[j];

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? if (j == t.length()) {

? ? ? ? ? ? return i - j;

? ? ? ? }else {

? ? ? ? ? ? return -1;

? ? ? ? }

? ? }

? ? /**

?? ? * next指的是KMP主算法中的j該回溯到哪個(gè)位置

?? ? *其值就是當(dāng)前位置之前的可覆蓋子串最大長度;

?? ? *

?? ? *所以代碼就是找可覆蓋子串的最大長度,

?? ? *其實(shí)就是:模式串自己對自己的匹配

?? ? *用prefix所指的串去匹配suffix所指的串

?? ? *所以代碼和kmp的主算法是類似的

?? ? * @param t

?? ? * @return

?? ? */

? ? public static int[] getNext(String t) {

? ? ? ? int[] next = new int[t.length()];

? ? ? ? next[0] = -1;

? ? ? ? int suffix = 0;? // 后綴

? ? ? ? int prefix = -1;? // 前綴

? ? ? ? while (suffix < t.length() - 1) {

? ? ? ? ? ? //若前綴索引為-1或相等,則前綴后綴索引均+1

? ? ? ? ? ? if (prefix == -1 || t.charAt(prefix) == t.charAt(suffix)) {

? ? ? ? ? ? ? ? ++prefix;

? ? ? ? ? ? ? ? ++suffix;

? ? ? ? ? ? ? ? next[suffix] = prefix;? //1

? ? ? ? ? ? }else {

? ? ? ? ? ? ? ? prefix = next[prefix];? //2

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return next;

? ? }

? ? /**

?? ? *改進(jìn)的就是可覆蓋子串的后一項(xiàng),可能和當(dāng)前項(xiàng)一樣

?? ? *如ABCDABD,第二個(gè)AB不該是0,1,而是-1,0

?? ? * @param t

?? ? * @return

?? ? */

? ? public static int[] getNext2(String t) {

? ? ? ? int[] next = new int[t.length()];

? ? ? ? next[0] = -1;

? ? ? ? int suffix = 0;? // 后綴

? ? ? ? int prefix = -1;? // 前綴

? ? ? ? while (suffix < t.length() - 1) {

? ? ? ? ? ? //若相等或前綴索引為-1,則前綴后綴索引均+1

? ? ? ? ? ? if (prefix == -1 || t.charAt(prefix) == t.charAt(suffix)) {

? ? ? ? ? ? ? ? ++prefix;

? ? ? ? ? ? ? ? ++suffix;

? ? ? ? ? ? ? ? //改進(jìn)的地方

? ? ? ? ? ? ? ? if (t.charAt(prefix) == t.charAt(suffix)) {

? ? ? ? ? ? ? ? ? ? next[suffix] = next[prefix];

? ? ? ? ? ? ? ? }else {

? ? ? ? ? ? ? ? ? ? next[suffix] = prefix;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }else {

? ? ? ? ? ? ? ? prefix = next[prefix];

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return next;

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 數(shù)據(jù)結(jié)構(gòu) 第8講 KMP算法 講這個(gè)算法之前,我們首先了解幾個(gè)概念: 串:又稱字符串,是由零個(gè)或多個(gè)字符組成的有限...
    rainchxy閱讀 1,467評論 0 3
  • 數(shù)據(jù)結(jié)構(gòu)與算法--KMP算法查找子字符串 部分內(nèi)容和圖片來自這三篇文章: 這篇文章、這篇文章、還有這篇他們寫得非常...
    sunhaiyu閱讀 1,882評論 1 21
  • 引言 字符串匹配一直是計(jì)算機(jī)科學(xué)領(lǐng)域研究和應(yīng)用的熱門領(lǐng)域,算法的改進(jìn)研究一直是一個(gè)十分困難的課題。作為字符串匹配中...
    潮汐行者閱讀 1,836評論 2 6
  • KMP算法是字符串模式匹配當(dāng)中最經(jīng)典的算法,原來大二學(xué)數(shù)據(jù)結(jié)構(gòu)的有講,但是當(dāng)時(shí)只是記住了原理,但不知道代碼實(shí)現(xiàn),今...
    小Two耶閱讀 350評論 0 0
  • 十年前,我們還都是校園里的孩子,我們有一群朋友,有男,有女。 那個(gè)時(shí)候,大多數(shù)男孩兒的愛好是打籃球,汗灑籃球場 附...
    花凌J閱讀 378評論 0 1

友情鏈接更多精彩內(nèi)容