vector<int> findNext(string str)
{
vector<int> next(str.size(), 0);
next[0] = 0;
for (int i = 1,k = 0; i < str.size(); i++)
{
while (k > 0 && str[k] != str[i])
k = next[k - 1]; //关键部分 若AB、CD 匹配,且A、B匹配,则A、D匹配
if (str[k] == str[i]) k++;
next[i] = k;
}
return next;
}
int KMP(string s, string p)
{
int n = s.size();
int m = p.size();
vector<int> next = findNext(p);
for (int i = 0,j = 0; i < n; i++)
{
while (j>0&&s[i] != p[j])
j = next[j-1];
if (s[i] == p[j])
j++;
if (j == m)
return i-m+1;
}
return -1;
}
KMP算法
最新推荐文章于 2025-06-23 08:55:19 发布