题目链接:点击打开链接
给你两个字符串,问你第二个字符串在第一个字符串首次出现的位置。
kmp模板题目,近期kmp的结束题目,近两天状态不佳,心事重重,sign..
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 1e6 + 6;
int n, m, nxt[MAXN], a[MAXN], b[MAXN];
void get_nxt()
{
memset(nxt, 0, sizeof(nxt));
int i = 0, j = -1;
nxt[0] = -1;
while(i < m) {
if(j == -1 || b[i] == b[j]) nxt[++i] = ++j;
else j = nxt[j];
}
}
int kmp()
{
int i = 0, j = 0;
while(i < n) {
if(a[i] == b[j]) {
if(j == m - 1) return i - m + 2;
++i, ++j;
}
else {
j = nxt[j];
if(j == -1) {
++i;
j = 0;
}
}
}
return -1;
}
int main(int argc, char const *argv[])
{
int t;
scanf("%d", &t);
while(t--) {
scanf("%d%d", &n, &m);
for(int i = 0; i < n; ++i)
scanf("%d", &a[i]);
for(int i = 0; i < m; ++i)
scanf("%d", &b[i]);
get_nxt();
printf("%d\n", kmp());
}
return 0;
}

本文介绍了一道KMP算法的经典题目,详细解释了如何通过KMP算法寻找一个字符串在另一个字符串中首次出现的位置,并提供了完整的AC代码实现。
654

被折叠的 条评论
为什么被折叠?



