数据结构实验之串二:字符串匹配
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description
给定两个字符串string1和string2,判断string2是否为string1的子串。
Input
输入包含多组数据,每组测试数据包含两行,第一行代表string1,第二行代表string2,string1和string2中保证不出现空格。(string1和string2大小不超过100字符)
Output
对于每组输入数据,若string2是string1的子串,则输出”YES”,否则输出”NO”。
Sample Input
abc
a
123456
45
abc
ddd
Sample Output
YES
YES
NO
Hint
Source
赵利强
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char p[101],t[101];
int next[101];
void makenext(char p[],int next[])
{
int q,k;
int m=strlen(p);
next[0]=0;
for(q=1,k=0;q<m;q++)
{
while(k>0&&p[q]!=p[k])
{
k=next[k-1];
}
if(p[q]==p[k])
{
k++;
}
next[q]=k;
}
}
void kmp(char p[],char t[],int next[])
{
int i,k,flag=0;
int m=strlen(p);
int n=strlen(t);
makenext(t,next);
for(i=0,k=0;i<m;i++)
{
while(k>0&&p[i]!=t[k])
{
k=next[k-1];
}
if(p[i]==t[k])
{
k++;
}
if(k==n)
{
flag=1;
printf("YES\n");
break;//注意要break,不然不会A的
}
}
if(flag==0)
{
printf("NO\n");
}
}
int main()
{
while(~scanf("%s%s",p,t))
{
kmp(p,t,next);
}
return 0;
}