模式匹配算法KMP算法是利用模式串的next函数求模式串在主串中各字符之后的位置的:
假设模式串为string T,长度为lenT,则next的求法可为:
void get_next(string T, int next[])
{
int len = T.length();
int i = 0, j = -1;
next[0] = -1;
while (i < len - 1)
{
if (0 > j || T[i] == T[j])
{
++i; ++j;
if (T[i] == T[j])
{
next[i] = next[j];
}
else
{
next[i] = j;
}
}
else
{
j = next[j];
}
}
}
利用模式串T的next求T在主串S中第Pos个字符之后的位置的KMP算法:
int Index_KMP(string S, string T, int pos, int next[])
{
int i = pos, j = 0;
while (i < S.length() && j < T.length())
{
if (j < 0 || S[i] == T[j])
{
//继续比较后继字符
++i;
++j;
}
else
{
//模式串向右移动
j = next[j];
}
if (j == T.length())
{
//匹配成功
return i - T.length();
}
else
{
return 0;
}
}
}