欢迎一起讨论!
方法一:
//KMP
namespace KMP{
vector<int> next;
void build(const string &pattern){
//next[0]=-1,next[1]=0
int i, j, n = pattern.length();
for (i = 0, j = next[0] = -1; i < n; next[++i] = ++j){
//j=0时依然不匹配,跳转j=next[0]=-1,这时候第一个字符就不匹配,则++i从下一个字符匹配,而匹配串从头开始匹配;
//pattern[i] != pattern[j],不匹配时跳转
while (j != -1 && pattern[i] != pattern[j]){
j = next[j];
}
}
}
vector<int> match(const string &pattern, const string &text){
vector<int> res;
int n = text.length(), m = pattern.length(), i, j;
build(pattern);
for (i = 0; i < n; i++){
//不匹配时,跳转到next[j]继续比较,
//j=0,next[j]=-1,不能在跳转
while (j > 0 && text[i] != pattern[j])
j =next[j];
if (text[i] == pattern[j]) //匹配成功时,i++,j++,i++在条件中
j++;
if (j == m){
res.push_back(i - n + 1); //把第一个匹配的字符放入容器中
j = next[j]; //继续跳转,i++,进行下一次匹配
}
}
}
}
方法二:(待补充)