一、KMP算法
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<string>
#include<deque>
using namespace std;
void getNextVal(string s, vector<int> &next, int n)
{
int k = -1;
int j = 0;
next[0] = -1;
while(j < n-1)
{
if(k == -1 || s[k] == s[j])
{
k++;
j++;
next[j] = k;
if(s[k] == s[j])
{
next[j] = next[k];
}
}
else
k = next[k];
}
}
int kmp(string s, string t) {
int m = s.length();
int n = t.length();
if(n == 0)
return 0;
vector<int> next(n,0);
getNextVal(t, next, n);
int i = 0, j = 0;
while(i < m && j < n)
{
if(j == -1 || s[i] == t[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if(j >= n)
return i-n;
return -1;
}
int main()
{
string s = "abcdeg,abcdeh, abcdef!";
string t = "abcdef";
cout << kmp(s, t) <<endl;
return 0;
}