KMP算法(15分)
KMP算法(15分)
函数get_nextval(char T[], int nextval[])是计算字符串T的next数组,函数Index_KMP(char S[], char T[], int pos, int next[])是KMP算法。
函数接口定义:#
void get_nextval(char T[], int next[]);
int Index_KMP(char S[], char T[], int pos, int next[]);
其中 T
是模式串,S
是主串,next
是next数组。
裁判测试程序样例:#
#include<cstring>
#include<iostream>
using namespace std;
#define MAXSTRLEN 255
void get_nextval(char T[], int next[]);
int Index_KMP(char S[], char T[], int pos, int next[]);
int main()
{
char S[MAXSTRLEN+1],T[MAXSTRLEN+1];
char S1[MAXSTRLEN],S2[MAXSTRLEN];
cin >> S1 >> S2;
strcpy(&S[1],S1);
strcpy(&T[1],S2);
S[0]=strlen(S1);
T[0]=strlen(S2);
int *next = new int[T[0]+1];
get_nextval(T,next);
cout<<Index_KMP(S,T,1,next);
return 0;
}
/* 请在这里填写答案 */
输入样例:#
第一行输入主串,第二行输入模式串:
abdsegdsagddfddfedfgds
egdsa
输出样例:#
输出子串在主串中第p个位置后首次出现的位序:
5
代码:#
// void get_nextval(char T[], int next[]) {
// int j=1,k=0;
// next[1]=0;
// while(j<T[0]) {
// if(k==0||T[j]==T[k]) {
// j++;
// k++;
// if(T[j]==T[k])
// next[j]=next[k];
// else
// next[j]=k;
// }
// else
// k=next[k];
// }
// }
// int Index_KMP(char S[], char T[], int pos, int next[])
// {
// int i=pos,j=1;
// while(i<=S[0]&&j<=T[0])
// {
// if(j==0||S[i]==T[j])
// {
// i++;
// j++;
// }
// else
// j=next[j];
// }
// if(j>T[0])
// return i-T[0];
// else
// return 0;
// }
void get_nextval(char T[], int next[])
{
int i = 1;
int j = 0;
next[1] = 0;
// int k = sizeof(T) / sizeof(T[0]);
while(i < T[0])
{
if(next[i] == next[j] || j == 0)
{
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
int Index_KMP(char S[], char T[], int pos, int next[])
{
int i = pos;
int j = 1;
get_nextval(T,next);
// int k1 = sizeof(S) / sizeof(S[0]);
// int k2 = sizeof(T) / sizeof(T[0]);
while(i <= T[0] && j <= S[0])
{
if(j == 0 || S[i] == T[j])
{
i++;
j++;
}
else
j = next[j];
}
if(j > T[0])
{
return i - T[0];
}
else
return 0;
}
作者:Evinci
出处:https://www.cnblogs.com/evinci/p/17123989.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律