关于学习KMP的姿势,是通过这篇博文来的从头到尾彻底理解KMP
文章写得非常的详细,所以我这个弱渣就没必要再谈一遍辣~~(>_<)~~
个人领悟的KMP就是保持主串不动,通过一个next数组来移动匹配串,最终达到高效率匹配字符作用的一种算法=。=
巨巨说KMP是纯模板题。。。。。。
——————————————————————————————————————————————————————————————————————————————
这道题题意是说给你两个字符串,求两个字符串最长的相等前后缀(第一个字符串求前缀,第二个字符串求后缀)。
代码如下:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
#include <stack>
#include <string>
typedef long long LL;
using namespace std;
int k_next[100000];
void kmp_next (string s)
{
int len = s.length();
k_next[0] = -1;
int k = -1; //前
int j = 0; //后
while (j < len)
{
if (k == -1 || s[k] == s[j])
{
k++;
j++;
k_next[j] = k;
}
else
{
k = k_next[k];
}
}
}
int main()
{
string s1, s2;
while (cin >> s1 >> s2)
{
memset(k_next, 0, sizeof(k_next));
string s3 = s1 + s2;
int flag, max;
max = INT_MIN;
kmp_next(s3);
int len = s3.length();
while (k_next[len] > s1.length() || k_next[len] >s2.length()) //如果超出范围就找更小的匹配串
len = k_next[len];
len = k_next[len];
for (int i=0; i<len; i++)
cout << s3[i];
if (len)
cout << " ";
cout << len << endl;
s1.clear();
s2.clear();
}
}