3.15週末學長教了一下kmp,但是對next的構造尚存疑.在饒了一整天頭以後勉強弄懂了…記錄一下比較混亂就是了…這裡的對稱指的的字元塊對稱而非軸對稱;
--------->當next[t]值為0時:
顯然就意味著從字串的開頭到這個t部分的話對稱性是0:即當繼續計算下一位的next[t+1] 的大小時只需比較第n+1位的字元與首字元是否相同即可
--------->當next[t]值不為0時:
這個時候就說明從字串的開頭到這個t部分的話存在對稱字元我們假設next[t]的值是a,那麼就說明前a個字元與後a個字元是相同的.我們計算next[t+1]時就只需要比較第a+1的字元與t+1的字元是否一致
當這兩個字元相同時,顯然,我們只需要令next[t+1]=next[t]+1即可
當這兩個字元不相同時
這裡先放乙個大佬碼的完整**
void
makenext
(const
char p,
int next)
next[q]
= k;
}}
相當於就是解釋一下這段語句的含義先看這幾個字母的定義
k:最大相同前字尾長度
p:輸入的要建next陣列的字串
q:要建立next陣列的下標
while(k > 0 && p[q] != p[k]):
這個很好理解,注意一下這個時候的k在沒有進行while迴圈時儲存的是在q-1個字元中的最大相同前字尾
意思就是如果沒有相同的前字尾了或者第k+1(因為next是從o開始建的)和第q個相同時我們就跳出
然後我們來分析一下:k = next[k-1];
這段**可以說是核心了
首先要進行這段語句的前提:
k > 0 && p[q] != p[k].首先要尚存相同的前字尾,如果已經沒有相同前字尾時,直接跳出給next[q]賦0就ok.並且p[q] != p[k].
緊接著看這個語句的意義:,我們仍然從第一次進入while迴圈分析:
這裡k本來是指q之前的字串最大前字尾長度,因為第q個字元和第k+1個字元不相同,我們再繼續找這最大前字尾長度包括的最大的前字尾長度,並且這樣迴圈的比較下去.知道發現能構成乙個新的最大前字尾長度或者是乾脆構不成.
KMP next陣列的求法
kmp 演算法的next陣列求法 void getnext char ptn,int next next j 更新自己的值。如果 1 j ptn i ptn j 這個條件成立,此時可以計算next i 1 的值為j 1。我看看這個過程 當i 6進入while迴圈之前,j next 6 當i 6進入w...
KMP next 陣列的思想
剛剛寫了點 我剛剛除錯了幾次 然後又在自行輸出 我先說說 啊,就是這個 next 陣列就為什麼可以求出前字尾最長 相同的數量?首先說說 前字尾,例如字串 aaaa,我們就直接用眼睛看的話,就是最長就是3,aaa a a aaa。這就是最長的前字尾,我們怎麼用 實現的呢?首先 前字尾 不能是一樣的 就...
KMP next陣列的花式使用
kmp演算法,是用來優化字串的模式匹配 源串s中是否存在模式串p 可以把暴力匹配的複雜度o n 降低到o m n 通過對模式串生成字首陣列 next陣列 來跳躍式的進行模式匹配,解決如hdu 1711 這樣的問題。我們一般使用的是把next 0 標記為負數 1 的修正版kmp。但是kmp演算法中最具...