SDUTACM 数据结构实验之串二:字符串匹配

来源:互联网 发布:matlab2016a破解版mac 编辑:程序博客网 时间:2024/05/21 01:56

Problem Description

  给定两个字符串string1和string2,判断string2是否为string1的子串。
 

Input

 输入包含多组数据,每组测试数据包含两行,第一行代表string1,第二行代表string2,string1和string2中保证不出现空格。(string1和string2大小不超过100字符)
 

Output

 对于每组输入数据,若string2是string1的子串,则输出"YES",否则输出"NO"。
 

Example Input

abca12345645abcddd

Example Output

YESYESNO

Hint

 
#include<stdio.h>#include<stdlib.h>#include<string.h>struct hh{    char str[100];    int len;};void Getnext(struct hh *t,int next[]){    int j=0,k=-1;    next[0]=-1;    while(j<t->len)    {        if(k==-1||t->str[j]==t->str[k])        {            k++;            j++;            if(t->str[j]!=t->str[k])                next[j]=k;            else                next[j]=next[k];        }        else            k=next[k];    }}int KMP(struct hh *s,struct hh *t){    int next[1000],i=0,j=0;    Getnext(t,next);    while(i<s->len&&j<t->len)    {        if(j==-1||s->str[i]==t->str[j])        {            i++;            j++;        }        else            j=next[j];    }    if(j>=t->len)        return i-t->len;    else        return (-1);}int main(){    struct hh *str1,*str2;    str1=(struct hh *)malloc(sizeof(struct hh));    str2=(struct hh *)malloc(sizeof(struct hh));    int x;    while(scanf("%s",&str1->str)!=EOF)    {        scanf("%s",&str2->str);        str1->len=strlen(str1->str);        str2->len=strlen(str2->str);        x=KMP(str1,str2);        if(x==-1)            printf("NO\n");        else            printf("YES\n");    }     return 0;}

0 0
原创粉丝点击