写模板,kmp。
1 为什么要写kmp? 因为find暴力匹配函数,时间复杂度过高,因为s串指针回溯问题。
2 为了避免s串指针回溯,对t串构建kmp表,该表记录了当前位置匹配失效时,下一个比较的下标。
3 原理?next表表示了当前下标j的最长公共前后缀长度,因为下标从0开始,这个长度也是最长公共前缀的下一个位置,也就是说,当在j匹配失效时,我们可以直接跳到next[j - 1]来进行匹配,避免了i指针回溯。
vector<int> getKmpTable(const string& t){
int m = int(t.size());
int len = 0, j = 1;
vector<int> next(m);
while (j < m){
if (t[j] == t[len]){
next[j ++] = ++len;
}
else if (len){
len = next[len - 1];
}
else{
j ++;
}
}
return next;
}
在构建表格时,len指针可以看作模式匹配时的j指针,而j可以看作i指针。len的回溯,代表了len下标与j无法继续相等,如果len不为1,那么下次比较的位置可以直接跳到next[len - 1],因为0~len是一个已经匹配成功的位置,所以这一段的公共前后缀无需再匹配。

浙公网安备 33010602011771号