1.首先要明白前缀和后缀的概念
前缀:一个字符串除了最后一个字母的所有组合。
比如字符串abcde,此字符串的前缀是a.ab,abc,abcd
后缀:一个字符串除了最前面一个字母的所有组合
字符串abcde: e de cde bcde
KMP算法定义了next数组 next[i]表示 以角标i的字串的前后缀的公共字串长度
//比如字符串abaaba
int next[]={0,0,1,1,1,2}
对于其中next数组的作用是用于next指针回退
如下代码是next数组的数组的实现
void get_Next(string s, int next[]) //这个函数对字符串s进行预处理得到next数组
{
int j = 0;
next[0] = 0; //初始化
for(int i = 1; i<s.size(); i++){ //i指针指向的是后缀末尾,j指针指向的是前缀末尾
while(j>0&&s[i]!=s[j]) j = next[j-1]; //前后缀不相同,去找j前一位的最长相等前后缀
if(s[i]==s[j]) j++; //前后缀相同,j指针后移
next[i] = j; //更新next数组
}
}
子串的匹配模式
int strSTR(string s, string t) //这个函数是从s中找到t,如果存在返回t出现的位置,如果不存在返回-1
{
if(t.size()==0) return 0;
get_Next(t, next);
int j = 0;
for(int i = 0; i < s.size(); i++){
while(j>0&&s[i]!= t[j]) j = next[j-1]; //字符串不匹配 字串回退到公共字符后一位
if(s[i]==t[j]) j++;
if(j==t.size()) return i - t.size() + 1;//匹配完成 返回第一个位置
}
return -1;
}