一直很纠结,上个月那次群赛,一直没有a掉拿到字符串匹配的题目。早上空气好,起来自己再写了一下那个KMP的next数组。
推荐看一篇博文,里面写得很清楚next数组的产生:http://www.matrix67.com/blog/archives/115
贴上代码留作纪念吧
#include
<
iostream
>
#include < cstring >
using namespace std;
// 这个next函数,所有的数组,字符串,下标都是从1开始计数的
void GetNext( char * T, int n, int * next)
{
for ( int i = 0 ; i < n; i ++ )
next[i] = 0 ;
next[ 1 ] = 0 ;
int j = 0 , i = 2 ;
for ( int i = 2 ; i < n; i ++ )
{
while (j > 0 && T[j + 1 ] != T[i]) j = next[j];
if (T[j + 1 ] == T[i]) j += 1 ;
next[i] = j;
}
/*
在此处总结一下:事实上,T[next[i]] == T[i]的,最初要得到next[i]是
通过这个规则来计算:
next[j]应该是所有满足T[1..next[j]] == T[j-next[j]+1..j]的最大值。
*/
}
#include < cstring >
using namespace std;
// 这个next函数,所有的数组,字符串,下标都是从1开始计数的
void GetNext( char * T, int n, int * next)
{
for ( int i = 0 ; i < n; i ++ )
next[i] = 0 ;
next[ 1 ] = 0 ;
int j = 0 , i = 2 ;
for ( int i = 2 ; i < n; i ++ )
{
while (j > 0 && T[j + 1 ] != T[i]) j = next[j];
if (T[j + 1 ] == T[i]) j += 1 ;
next[i] = j;
}
/*
在此处总结一下:事实上,T[next[i]] == T[i]的,最初要得到next[i]是
通过这个规则来计算:
next[j]应该是所有满足T[1..next[j]] == T[j-next[j]+1..j]的最大值。
*/
}