字符串匹配——KMP算法
KMP算法的作用与介绍
主要用于字符串的匹配
KMP的主要思想:当出现字符串不匹配时,可以利用之前以匹配的文本内容退回到适当位置,从而避免从头再去做匹配了。(重点!!!)
KMP中最难理解的就是:如何找出应退至的位置(哎,这就引出了next数组(前缀表)用于记录之前的文本内容间的关系。)
什么是前缀表
前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。
前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串。
通俗点讲奥,就是找前面是否有与自己相同的字符串,有则记录下来,以便回退
(这个前缀表有些人会对其内容同一减1,其实减不减都行,我习惯不减)
前缀表(不减一)完整代码
class Solution {
public:
void getNext(int* next, const string& s) {
int j = 0;
next[0] = 0;
for(int i = 1; i < s.size(); i++) {
while (j > 0 && s[i] != s[j]) {
j = next[j - 1];
}
if (s[i] == s[j]) {
j++;
}
next[i] = j;
}
}
int strStr(string haystack, string needle) {
if (needle.size() == 0) {
return 0;
}
vector<int> next(needle.size());
getNext(&next[0], needle);
int j = 0;
for (int i = 0; i < haystack.size(); i++) {
while(j > 0 && haystack[i] != needle[j]) {
j = next[j - 1];
}
if (haystack[i] == needle[j]) {
j++;
}
if (j == needle.size() ) {
return (i - needle.size() + 1);
}
}
return -1;
}
};