KMP算法模板
2016-12-20 12:01
246 查看
给定一个主字符串s和一个目标字符串p,判断主串s中是否包含了目标串p。这就是KMP算法的经典应用场景。说白了就是判断目标串p中,各个位置的最长公共前后缀。之前看了不少网上的代码,由于对于next数组的定义有稍微的区别,导致网上的代码在某些细节的处理上稍有不同,所以只要记一种就可以了。
下面是查找的代码
这里next[i]=k,的含义是当p中的下标为i的地方和s中的某一位失配的时候,下次从p的下标为k的地方开始比较。
下面是查找的代码
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]; } } }