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

数据结构实验之串二:字符串匹配
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;
}

猜你喜欢

转载自blog.csdn.net/bhliuhan/article/details/80370352