vector<int> getNext(string target)
{
vector<int> next(target.length(), 0);
next[0] = -1;
int k = -1;
int j = 0;
while (j < target.length() - 1)
{
if (k == -1 || target[j] == target[k])
{
if (target[++j] == target[++k])
{
next[j] = next[k];
}
else
{
next[j] = k;
}
//next[++j] = ++k;
}
else
{
k = next[k];
}
}
return next;
}
int KMP(string t, string p)
{
int i = 0; // 主串的位置
int j = 0; // 模式串的位置
vector<int>next = getNext(p);
while (i < t.length() && j < p.length())
{
if (j == -1 || t[i] == p[j])
{ // 当j为-1时,要移动的是i,当然j也要归0
i++;
j++;
}
else
{
j = next[j]; // j回到指定位置
}
}
if (j == p.length())
{
return i - j;
}
else
{
return -1;
}
}
KMP算法
最新推荐文章于 2023-10-15 23:04:56 发布