0
点赞
收藏
分享

微信扫一扫

LOJ #103. 子串查找 && KMP复习


题目链接:​​传送门​​

拿来复习一下KMP
思想就是在失配的时候找到一个前后相同的位置继续匹配
从而减少了来回移动的复杂度
首先是对自身一个操作,就是要找到以每个字符结尾的最长公共前后缀
比如说ababac
就是0 0 1 2 1 0
而通常所说的next数组就是去掉当前数之后的上面的最长公共前后缀
通常把初值赋为-1方便边界的判断
上面这个字符串的next数组就是-1 0 0 1 0 0
然后再结合代码就很好理解了

#include <bits/stdc++.h>
#define

using namespace std;
typedef long long ll;
int nxt[A], n, k, len1, len2, ans;
char s1[A], s2[A];

int main(int argc, char const *argv[]) {
cin >> s1 >> s2; len1 = strlen(s1); len2 = strlen(s2);
int i = 0, j = -1; nxt[0] = -1;
while (i < len2)
if (j == -1 or s2[i] == s2[j]) nxt[++i] = ++j;
else j = nxt[j]; //求自身的next数组
i = 0; j = 0;
while (i < len1) {
if (j == -1 or s1[i] == s2[j]) i++, j++;
else j = nxt[j];
if (j == len2) ans++, j = nxt[j];
}
cout << ans << endl;
}


举报

相关推荐

0 条评论