题目描述
给定两个字符串string1和string2,判断string2是否为string1的子串。
输入
输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。
输出
对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。
示例输入
abc a 123456 45 abc ddd
示例输出
1 4 -1
最简单的模版
#include <stdio.h> #include <string.h> #define N 1000005 char a[N],b[N]; int next[N]; void getnext() { int len,i=0,j=-1; len=strlen(b); next[0]=-1; while(i<len) { if(j==-1||b[i]==b[j]) { i++; j++; next[i]=j; } else j=next[j]; } } int get() { int i=0,j=0; int len1,len2; len1=strlen(a); len2=strlen(b); while(i<len1&&j<len2) { if(j==-1||a[i]==b[j]) { ++i; ++j; } else j=next[j]; } if(j>=len2) return i-len2+1; else return -1; } int main() { int s; while(scanf("%s",a)!=EOF) { scanf("%s",b); getnext(); s=get(); printf("%d\n",s); } }
#include<stdio.h> #include<string.h> void getnext(char *a,int *next); int idekmp(char*s,char *a); int next[1000002]; char a[1000002],s[1000002]; int main() { int m,i,j; while(scanf("%s",s)!=EOF) { scanf("%s",a); getnext(a,next); m=idekmp(s,a); if(m!=0) printf("%d\n",m); else printf("-1\n"); } return 0; } int idekmp(char*s,char *a) { int i=0,j=0,n,m,x=0; n=strlen(s); m=strlen(a); while(i<n&&j<m) { if(j==0||s[i]==a[j]) { i++; j++; } else { if(a[j]==0) { j=0; i++; x=i; } else { j=next[j]; x=i-j; } } } if(j>=strlen(a)) return x+1; else return 0; } void getnext(char *a,int *next) { int i=1,j=0,r; r=strlen(a); next[0]=next[1]=0; while(i<r) { if(j==0||a[i]==a[j]) { i++; j++; next[i]=j; } else j=next[j]; } }
这段代码是我一不小心把if(next[j]==0)<span style="font-family: Arial, Helvetica, sans-serif;">写成了if(a[j]==0)</span><span style="font-family: Arial, Helvetica, sans-serif;">但是对了,虽然我不明白为什么对了</span>
<pre code_snippet_id="183536" snippet_file_name="blog_20140211_1_496344" class="html" name="code">#include<stdio.h> #include<string.h> void getnext(char *a,int *next); int idekmp(char*s,char *a); int next[1000002]; char a[1000002],s[1000002]; int main() { int m,i,j; while(scanf("%s",s)!=EOF) { scanf("%s",a); getnext(a,next); m=idekmp(s,a); if(m!=0) printf("%d\n",m); else printf("-1\n"); } return 0; } int idekmp(char*s,char *a) { int i=0,j=0,n,m,x=0; n=strlen(s); m=strlen(a); while(i<n&&j<m) { if(j==0||s[i]==a[j]) { i++; j++; } else { if(next[j]==0)//刚开始把这个地方忘记了,后来明白了,j是从1计数的不能0,所以这各地方就是把j指向a的第一个输的位置
{ j=1; i++; x=i-j; } else { j=next[j]; x=i-j; } } } if(j>=strlen(a)) return x+1; else return 0; } void getnext(char *a,int *next) { int i=1,j=0,r; r=strlen(a); next[0]=next[1]=0; while(i<r) { if(j==0||a[i]==a[j]) { i++; j++; next[i]=j; } else j=next[j]; } }
#include<stdio.h> #include<string.h> int next[1000002]; char a[1000002],b[1000002]; int NE(char *b,int *next) { int i=0,j=-1,n; n=strlen(b); next[0]=next[1]=-1; while(i<n) { if(j==-1||b[i]==b[j]) { i++; j++; next[i]=j; } else j=next[j]; } } int ge(char *a,char *b) { int i=0,j=0,n,m,x=0; n=strlen(a); m=strlen(b); while(i<n&&j<m) { if(j==0||a[i]==b[j]) { i++; j++; } else { j=next[j]; x=i-j; } } if(j>=m) return x+1; else return 0; } int main() { int m; while(scanf("%s",a)!=EOF) { scanf("%s",b); NE(b,next); m=ge(a,b); if(m!=0) printf("%d\n",m); else printf("-1\n"); } return 0; }