现复习BF算法及KMP算法
其他算法待
KMP思路理解推荐
#include <iostream>
#include <string>
using namespace std;
int BF(string s, string t);
//RK算法 待
void getNext(string t, int next[]);
int KMP(string s, string t, int next[]);
//BM算法 待
//Sunday算法 待
int main()
{
string s = "acabaabcaabcacaabc";
string t = "abaabc";
int next[10];
cout << BF(s,t);;
cout << KMP(s, t, next);
return 0;
}
int BF(string s, string t)
{//直接硬暴力
int s_n = s.size(),t_n = t.size(); //获取字符串长度
int s_p = 0, t_p = 0; //初始化
while (s_p < s_n && t_p < t_n) // 两指针均为循环限定
if (s[s_p] == t[t_p]) //查到等
s_p++,t_p++; //两指针均前进
else
s_p = s_p - t_p + 1,t_p = 0; //两指针均复原
if (t_p >= t_n) //短串走到头
return s_p - t_p; //指针差值(长串对应指针头)
else
return -1; //未找到
}
void getNext(string t, int next[])
{//板子 更新next数组
int n = t.size(); //获取字符串长度
int i = 0, j = -1; //初始化
next[i] = j; //数组初始化
while (i < n - 1) // i为循环限定
if (j == -1 || t[i] == t[j]) //查到头||查到等
next[++i] = ++j; // next只在此更新 i同
else
j = next[j]; // j往前查 下一循环判
}
//http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
int KMP(string s, string t, int next[])
{//板子 返回符合串开始的下标
int s_n = s.size(), t_n = t.size(); //获取字符串长度
int s_p = 0, t_p = 0; //初始化
getNext(t, next); //数组初始化
while (s_p < s_n && t_p < t_n) // 两指针均为循环限定
if (t_p == -1 || s[s_p] == t[t_p]) //查到头||查到等
s_p++, t_p++; //长串指针只在此更新
else
t_p = next[t_p]; //短串往前查 下一个循环判
if (t_p == t_n) //短串走到头
return s_p - t_p; //指针差值(长串对应指针头)
else
return -1; //未找到
}