kmp算法(快速子字符串匹配)的next数组理解

因为没什么时间,所以本文只是匆匆记述了此时的感悟

对于next数组的理解心得:

也就是next数组相当于一个转化函数,当遇到某个位置不匹配就找next数组对应的位置,看如何滑动子串。

因为根本不需要看主串,只看子串就可以了,所以next数组记录的就是当前不匹配的配置让子串当前不匹配位置之前的哪个字符位置滑动过来(因为子串是要往后走的,即走多少停止)

eg:

子串s[]="0ababeopr"(假设初始下标为1开始记录子串),假设s[5]处出现不匹配,也就是前四个(abab)都匹配,此时应找匹配字符段(abab)最长公共前后缀(概念有必要弄清楚),易知为ab,所以要让最长公共前后缀的后一个位置的字母(即第二个a)滑动到e处,也就是说此时next[5]=3(3为第二个a的下标)。

假设s[1]处就不匹配,开头就歇菜,那么next[1]=0,即让s[0]滑动到此处,也就是子串整体后移一个位置。

至于为啥可以直接这么滑动多个字符,而不是像BF算法那样简单的当遇到不匹配时就回溯原处退一个继续,其实不难理解,就比如上面那样,最长公共前后缀ab,前面的和后面的肯定相等,也即如此滑动后前n个仍匹配(n=最长公共前后缀长度)

猜你喜欢

转载自blog.csdn.net/weixin_44593822/article/details/108143420
今日推荐