算法与数据结构——kmp算法
7-1 jmu-ds-实现KMP
分数 10
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; const int MAX_LEN = 20010; //本题运用到字符串比对中的next[j]求法具体算法可以直接百度 //get_next就是用于求next[j]的这里只需要传入目标串就行 void get_next(char str[] ,int len, int next[]) { int i=0,j=0; next[0]= -1; for(i=0;i<len;i++) { while(j>0 && str[i] !=str[j]) { j=next[j-1]; if(str[i]==str[j]) j++; next[i]=j; } } } int find(char s[] ,int len_s ,char t[],int len_t,int next[]) { int i=0; int j=0; while(i<len_s&&j<len_t) { if(j ==-1||s[i]==t[j]) { j++; i++; } else { j=next[j]; } } if(j==len_t) return i-j; else return -1; } int main () { int cas; char s[MAX_LEN],t[MAX_LEN]; int next[MAX_LEN]; scanf("%d" ,&cas); while(cas--) { scanf("%s %s",s,t); int len_s=strlen(s);//求出字符串的长度 int len_t=strlen(t); get_next(t,len_t,next);//针对目标字符串求出next【j】 if(find(s,len_s,t,len_t,next)!=-1) { printf("%d\n",find(s,len_s,t,len_t,next)); } else{ printf("not find!\n");} } }
给两个字符串A、B, 从A中找出第一次出现B的位置。
输入格式:
第一行输入一个整数n,表示测试数据的个数
对于每组测试数据,输入两个字符串S T,S和T中间用一个空格隔开,每组数据占一行。
输出格式:
对于每组测试数据,输出A中找出第一次出现B的位置,如果A不包含B,输出“not find!”
输入样例:
3 abcdabbcd abbc abcd efg abbcdd bbc 上面是代码下面是有关模式传中next[j]以及nextval[j]的求法
输出样例:
4 not find! 1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了