kmp算法求next数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kmp算法求next数组相关的知识,希望对你有一定的参考价值。
参考技术AKMP算法,主要分为2个阶段:
求next数组。
字符串匹配
next数组,就是对给定的“匹配字符串”,求出其每一个子长度字串的“最长前缀和最长后缀相等的长度”。
匹配串,p="aabcaabbaa", 长度n=10。因此子串为sub[10]:
sub[0] = "a"sub[1] = "aa"sub[2] = "aab"sub[3] = "aabc"sub[4] = "aabca"sub[5] = "aabcaa"sub[6] = "aabcaab"sub[7] = "aabcaabb"sub[8] = "aabcaabba"sub[9] = "aabcaabbaa"
根据“最长前缀和最长后缀相等的长度”,可以求出对应的next数组是:
next[0] = -1; // "a"next[1] = 0; // "aa"next[2] = -1; // "aab"next[3] = -1; // "aabc"next[4] = 0; // "aabca"next[5] = 1; // "aabcaa"next[6] = -1; // "aabcaab"next[7] = -1; // "aabcaabb"next[8] = 0; // "aabcaabba"next[9] = 1; // "aabcaabbaa"
2. 利用上部求出的next数组,对t和p进行匹配。要点是:
123 (1)循环匹配(2)如果整个匹配上,则返回匹配位置。(3)如果当前位置没有匹配上,则:如果对应next[x]为-1,则跳过整个p的长度;否则,回溯到其前缀位置进行匹配。匹配上,则右移next[x-1]位置;否则,右移next[x]位置。以上是关于kmp算法求next数组的主要内容,如果未能解决你的问题,请参考以下文章
poj2406(求字符串的周期,kmp算法next数组的应用)
字符串匹配KMP算法中Next[]数组和Nextval[]数组求法