自我学习
给两个字符串A、B, 从A中找出第一次出现B的位置。
输入格式:
第一行输入一个整数n,表示测试数据的个数
对于每组测试数据,输入两个字符串S T,S和T中间用一个空格隔开,每组数据占一行。
输出格式:
对于每组测试数据,输出A中找出第一次出现B的位置,如果A不包含B,输出“not find!”
输入样例:
3
abcdabbcd abbc
abcd efg
abbcdd bbc
输出样例:
4
not find!
1
#include<stdio.h> #include<string.h> const int MAX = 10000; void get_next(char str[],int len,int next[]); int find(char s[],int len_s,char t[],int len_t,int next[]); int main(){ int cas,a; char s[MAX],t[MAX]; int next[MAX]; 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);//构建部分匹配表 a = find(s,len_s,t,len_t,next);//在s中查找t if(a == -1) printf("not find!\n"); else printf("%d\n",a); } return 0; } //构建部分匹配表(Next数组) void get_next(char str[],int len,int next[]) { int i = 0; int j = 0; next[0] = -1; for(i = 1;i<len;i++){ while(j>0 && str[i] != str[j]) j = next[j - 1]; if(str[i] == str[j]) j++; next[i] = j; } } //使用KMP算法在字符串s中查找第一次出现字符串t的位置 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;//未找到匹配 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南