KMP中next数组的理解
next數(shù)組是KMP的核心,但對(duì)于next數(shù)組我們總是有時(shí)候感覺明白了,但有時(shí)候又感覺沒明白,現(xiàn)在我就說下我自己對(duì)KMP中next數(shù)組的理解,首先next[i]上的數(shù)字的意義,next[i]表示的是當(dāng)匹配到匹配串的第i個(gè)字母適配的時(shí)候,改跳到的位置,為什么要跳,是因?yàn)椴幌牖氐?重新浪費(fèi)時(shí)間去比較,在深一點(diǎn)理解,我感覺next[i],里存的是 找兩個(gè)相同的盡量長(zhǎng)的字符串,一個(gè)是以從匹配串的第一個(gè)字母開始的,另一個(gè)是以失配字母i的前一個(gè)點(diǎn)結(jié)尾的,他倆可以有相交的地方,但不能完全相交,得到這兩個(gè)串的最大長(zhǎng)度后+1,就是next[i],通俗的理解就是假如 1231231234 當(dāng)匹配到4的時(shí)候突然失配了,那么我們就找兩個(gè)串,以個(gè)是以第一個(gè)開頭,另一個(gè)是以4前面的那個(gè)3結(jié)尾,可以相交但不可以完全相交,得到的就是123123 123123,那么當(dāng)4失配的時(shí)候就直接跳到第二個(gè)3后后面的那個(gè)1比較就行了,因?yàn)楫?dāng)前的這個(gè)失配點(diǎn)的前一個(gè)點(diǎn)為尾的串和以第一個(gè)點(diǎn)為起點(diǎn)的串的相等關(guān)系,我們可以有把握的直接跳,減少時(shí)間。總之next,KMP給我的感覺就是記憶化搜索,而記憶化搜索我有覺得是DP,所以KMP感覺也是dp吧。畢竟是每一步都不會(huì)去走多余的路。
next數(shù)組關(guān)于循環(huán)節(jié)幾個(gè)小應(yīng)用
(1)i - next[i] 最小循環(huán)節(jié)(第一個(gè)字母開始)
(2)next[i] 最大循環(huán)節(jié)中的第幾位數(shù)(此時(shí)循環(huán)節(jié)可交叉)
(3)next[i] != 0 && i % (i - next[i]) == 0,當(dāng)前是循環(huán)節(jié)中的最??? 后一位.
(4)在(3)的前提下 i / (i - next[i]) 表示的最大周期個(gè)數(shù),也就是在最小循環(huán)節(jié)的前提下的最大周期個(gè)數(shù)。
總結(jié)
以上是生活随笔為你收集整理的KMP中next数组的理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 1867 求两个串的和最小 ,K
- 下一篇: hdu2594 简单KMP