hdoj 2087 剪花布条

 

考察点:kmp 的 简单应用

 

 

题目大意:输入两个字符串str1,str2,计算出从前面的字符串str1中能够剪出多少个str2,并输出。

 

 

题目解析: 典型的kmp应用,每一次匹配后如果相同,次数加1,不过由于是剪布条,所以一旦剪出符合的str2,只能从剩下的串里面继续匹配,直到最后。

简单来说就是,str2不能重叠出现,一旦匹配成功就要从后面的在重新开始匹配工作。

 

 

AC代码:

#include <stdio.h>
#include <string.h>
#define m 1200

char str[m],buf[m*2];
int next[m];
int len1,len2,cont;

void getnext()            // 将主串分成适宜匹配的模式
{
    int i=0,j=-1;
    next[i]=j;
    len1=strlen(str);
    while(i<len1-1)
    {
        if(j==-1||str[i]==str[j])
        {
            i++,j++;
            next[i]=j;
        }
        else j=next[j];
    }
}

int kmp()
{
    getnext();
    int i=0,j=0;
    cont=0;
    len1=strlen(str);
    len2=strlen(buf);
    while(i<len2)
    {
        if(j==-1||str[j]==buf[i])   // 符合匹配条件
        {
            i++,j++;
            if(j==len1) cont++;      //一次匹配成功
        }
        else j=next[j];   // 不符合条件直接下跳
    }
    return cont;
}

int main()
{
    while(scanf("%s",buf)&&buf[0]!='#')   //对应题目中输入’#’输入结束的要求
    {
        scanf("%s",str);
        printf("%d\n",kmp());    //输出匹配成功的次数,即剪出的数量
    }
    
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值