kmp算法中j=next[j]的理解

next数组求解中,相信对于求解过程依赖于前一位的值。如果p[j] == s[i], 那么++j这些都容易理解,就是如果next数组中求值的这个这位的字符,如果和前缀的下一位字符继续相同的话,说明前缀字符串可以继续加长。这就是next数组的值=++j的意思。

但是如果不同呢,这时就需要减少前缀的长度进行比较,于是算法中给出了j=next[j],就是说前缀长度取值变成了next[j]继续比较。

这里的确很让人疑惑,为什么要取值next[j]呢?
在说这个问题之前,先要说一个前提,就是为什么模式串下一位不同,前缀就要减少,不能增加吗?答案是不能,如果可以增加的话,那么上一位next数组的就还可以增大,也就是j值就是不正确的。因为上一位已经求出了最大的j值。所以不存在更大的j值可以匹配的情况。所以下一位不同,那么j值只能减小,才能找到可能匹配的前缀。

明确了上面这个前缀长度只能减少的结论。那问题就好办一些了。由于j要减少,对于后缀来说,也就是i指向的位置(包括i)往前的长度,要减少。我们先考虑认为长度减少一个。就来研究这个长度,也就是j-1长度的字符串。

我们需要同时研究前缀j-1的字符串,和i前面(含i)j-1的长度的字符串。这两个字符串现在有什么关系呢?我们发现,前缀除掉第一个字符剩下的字符串,刚好是不含i的后缀字符。
如果不理解,大家可以想象一下,两个本来一样的木头,第一根(前缀)后面砍掉一块,第二根前面砍掉一块。那么他俩的关系,就是第一根前面再砍掉一块,和第二根后面砍掉一块,他们仍然是一样的。

明白了前缀除掉第一个字符剩下的字符串,刚好是不含i的后缀字符。这个道理,我们往下继续。我们思考如果我们只想比较i字符串的话,就要设法找到不含i的j-1字符串, 也就是i前面j-1-1的字符串中能够匹配到前缀一样的这个字符串最大的那个长度。而这个j-1-1的字符串刚好就在前缀中的后面。所以对于j-1的前缀。我们只需要找到它的最大前后缀,就找到了能够匹配i前面的能匹配的最大长度的前缀。

而对于j-1的前缀寻找他的最大前后缀,就是next[j]的值,前面已经求过了。只需要取。
这就是为什么接下来j=next[j]的原理。

重置了这个指针之后,然后还是重复第一步的动作,比较当前值和最大前缀的后一位的值是否相同。循环往复,一直查到j=1的这个最短长度,就直接赋值为1,后比较下一个了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容