KMP算法
getNext()函数
&emsp 需要得到一个nex数组,代表在字符串第一次匹配失败后可以从nex处重新匹配,这也是kmp算法比朴素匹配算法优越的原因。
给代码:
void getNext(std::string st)
{
int k = -1, len = st.length();
nex[0] = -1;
for (int i = 1; i < len; i++)
{
while (k > -1 && st[k + 1] != st[i])
k = nex[k];
if (st[k + 1] == st[i])
k++;
nex[i] = k;
}
}
匹配过程
&emsp 从上次匹配的最后位置开始匹配。
代码:
void kmp(std::string s1, std::string s2)
{
int l1 = s1.length(), l2 = s2.length();
int idx = 0;
getNext(s2);
for (int i = 0; i < l1; i++)
{
if (s1[i] == s2[idx])
idx++;
else
{
if (idx > 0)
{
idx = nex[idx - 1] + 1;
i--;
}
else
idx = 0;
}
if (idx == l2)
{
idx = nex[idx - 1] + 1;
a[cnt++] = i - l2 + 1;
}
}
}
两过程均通过洛谷P3375评测