首先介紹什麼是next陣列
定義:
next[i]表示是子串s[0……i]的最長相等前字尾的字首的最後一位下標。(認真理解不難)
下圖給出了next陣列的定義計算
其中下框第一行是字首,下框第二行是字尾
注意字首和字尾可以部分重疊但是不能使是s[0……i]本身(很好理解這是必然因為字首和字尾都是本身,比較毫無意義)
相信你對next陣列有了一定的了解
怎麼求?
採用遞迴的思想來做
對於字串abababc而言已經有了next[0]=-1(所有的next陣列都一樣)next[1]=-1 ,next[2]=0 ,next[3]=1,現在來求next[4]???
當計算出next[3]=1時最長相等子串「ab」,next[4]與next的關係看是s與s【j+1】(s【next+1】)是否相等,因為相等直接得到next[4]=next[3]+1=1+1=2;並且j指向了
next[4]。
計算next的時候不一樣了,s[5]!=s[next[4]+1]怎麼辦?
此時想找乙個j使得s[5]s[j+1]成立並且上圖中波浪線~代表aba中相等前字尾並且j盡可能大
由此想到讓jnext然後再判斷s[5]==s[j+1],如果成立next【i】=j+1即可,如果不成立就不斷讓j等於next【j】直至-1,或者s==s【j+】成立即可。
對於這個問題的next而言,j退到-1時驚奇的發現是s[5]==s[j+1]於是next=j+1=-1+1=0。
並j指向0.
void getnext(char s, int len)
if (s[i] == s[j + 1])
next[i] = j + 1;
}}
接下來kmp就簡單了
已知text和pattern
判斷pattern是否時text的字串
}完成!!!祝大家程式設計愉快!
KMP演算法next求法
定義 1 next 0 1 意義 任何串的第乙個字元的模式值規定為 1。2 next j 1 意義 模式串t中下標為j的字元,如果與首字元 相同,且j的前面的1 k個字元與開頭的1 k 個字元不等 或者相等但t k t j 1 k 如 t abcabcad 則next 6 1,因t 3 t 6 3 ...
KMP演算法中Next陣列的求法
例如 序列號 1 2 3 4 5 6 7 8 模式串 a b a a b c a c next值 0 1 1 2 2 3 1 2 next陣列的求解方法是 第一位的next值為0,第二位的next值為1,後面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,...
KMP演算法(超容易理解的next陣列求法)
我想,既然知道kmp演算法了,自然對於其具體如何運作也是有一定的了解的,我也沒必要再大費口舌講廢話,大家一定查過很多資料,但是其實也都看的一知半解,好像自己懂了但是又沒有理解透,特別是next陣列的求法感覺很蛋疼,那麼我就來給大家解決一下這個next陣列的問題吧,如果對kmp演算法沒有概念的同學請先...