Java實現KMP演算法

2021-07-04 19:02:10 字數 898 閱讀 1516

對於查詢字元子串在父字串中出現的位置,我們可以使用kmp演算法。

kmp演算法的實現原理是使子串向右滑盡可能的遠,這就涉及到求滑動距離的陣列next.

next陣列中每個元素求解的公式是;

private static void kmpnext(int next, string str)}}

} }

這裡需要附加說明的是str.substring(start, end)函式,其擷取的字串是從第start個字元開始到第end個字元結束,但不包括第end個字元。注意是不包括第end個字元。

求取next陣列中還有一點點小竅門,可以減少一點的計算量。

下面對上述方法進行修改。

由於從下表0開始有點不方便思考(太笨了),所有下標都從1開始。

求next陣列,其實可以利用next已經得出的資訊求的,方法原理如下:(來自hihocoder)

實現**如下:

private static void kmpnext1(int next, string son)else

if( q == -1)

} }

使用上述kmpnext1方法求出的結果是:如bababb->,next[i]=-1表示匹配失敗。

利用上述得到的next陣列,便可以對父串和子串進行比較了,見如下**:

private static int kmp(string father, string son)

}else

if(q == -1)

} return times;

}

kmp演算法 java實現

通常我們想在乙個字串中匹配乙個子字串,會遍歷字串,對於每乙個字元,都遍歷子字串進行匹配,這樣時間複雜度為o nm 使用kmp演算法只需先進行乙個o m 的預處理 生成next陣列 就能將搜尋的時間複雜度降低至o n m 下面講一講kmp演算法的實現原理。對於abcdeabd.和abcdeabc,當匹...

KMP演算法(java實現)

kmp演算法是由donald kunth vaughan pratt james h.morris三個人發明的,是一種複雜度很小的匹配字串的演算法。給定兩個字串str和match,長度分別為n和m。實現乙個演算法,如果字串str中含有子串match,則返回match在str中的開始位置,不含有則返回...

KMP 演算法 java實現

在網上找到的 執行出來的模式值和資料裡根據定義計算出來的值不一樣,沒有找到合適的,於是手寫了乙個。模式值定義 1 next 0 1 意義 任何串的第乙個字元的模式值規定為 1。2 next j 1 意義 模式串t中下標為j的字元,如果與首字元相同,且j的前面的1 k個字元與開頭的1 k個字元不等 或...