题目描述
给定两个字符串string1和string2,判断string2是否为string1的子串。
输入
输入包含多组数据,每组测试数据包含两行,第一行代表string1,第二行代表string2,string1和string2中保证不出现空格。
输出
对于每组输入数据,若string2是string1的子串,则输出"YES",否则输出"NO"。
示例输入
abc a 123456 45 abc ddd
示例输出
YES YES NO#include<stdio.h> #include<string.h> int main() { char a[1000],b[1000]; int i,j,n,m; while(scanf("%s",a)!=EOF) { memset(b,0,sizeof(b)); scanf("%s",b); n=strlen(a); for(i=0; i<n;) { if(a[0]!=b[0]) { n=n-1; for(m=0; m<n; m++) a[m]=a[m+1]; } else if(strcmp(a,b)==0) { printf("YES\n"); break; } else if(strcmp(a,b)>0) { printf("YES\n"); break; } else { printf("NO\n"); break; } if(n<=0) { printf("NO\n"); break; } } } return 0; }
</pre><pre code_snippet_id="181940" snippet_file_name="blog_20140210_1_340671" name="code" class="cpp">
</pre><pre code_snippet_id="181940" snippet_file_name="blog_20140210_1_340671" name="code" class="cpp">KMP算法
<pre name="code" class="cpp">#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int next[1000010]; char a[1000010],b[1000010]; void getnext() { int i=0; int j=-1; next[0]=-1; int len=strlen(b); while(i<len) { if(j==-1||b[i]==b[j]) { i++; j++; next[i]=j; } else j=next[j]; } } void get() { int i=0,j=0; int len=strlen(a); int len2=strlen(b); while(i<len&&j<len2) { if(j==-1||a[i]==b[j]) { i++; j++; } else j=next[j]; } if(j>=len2) printf("YES\n"); else printf("NO\n"); } int main() { while(~scanf("%s",a)) { scanf("%s",b); getnext(); get(); } return 0; }