您的位置:首页 > 其它

KMP算法模板

2016-12-20 12:01 246 查看
给定一个主字符串s和一个目标字符串p,判断主串s中是否包含了目标串p。这就是KMP算法的经典应用场景。说白了就是判断目标串p中,各个位置的最长公共前后缀。之前看了不少网上的代码,由于对于next数组的定义有稍微的区别,导致网上的代码在某些细节的处理上稍有不同,所以只要记一种就可以了。

下面是查找的代码

int kmp(const string& s, const string& p)
{
std::vector<int>next(p.size());
getNext(p, next);//获取next数组,保存到vector中

int i = 0, j = 0;
while(i != s.size() && j != p.size())
{
if (j == -1 || s[i] == p[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}

return j == p.size() ? i - j: -1;
}


这里next[i]=k,的含义是当p中的下标为i的地方和s中的某一位失配的时候,下次从p的下标为k的地方开始比较。

void getNext(const string &p, vector<int> &next)
{
next.resize(p.size());
next[0] = -1;

int i = 0, j = -1;
while (i != p.size() - 1)
{
//这里注意,i==0的时候实际上求的是next[1]的值,以此类推
if (j == -1 || p[i] == p[j])
{
++i;
++j;
next[i] = j;
}
else
{
j = next[j];
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: