HDU-#2087 剪花布条(KMP & strstr)

      题目大意:给出一个字符串,以及模板串,求字符串中有多少个模板串即子串?

      解题思路:该题有两种做法,一是直接利用库函数中strstr()函数求解,每次找到一个就将其下标下移即可;二是利用kmp进行匹配,这是基础的kmp应用。两种解法详见code。

      题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=2087

     code:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN = 1000+10;
char str[MAXN],pat[MAXN];
char next[MAXN];
int lenp,lens;

void getFail(){ //失配函数
    int i=0,j=-1;
    next[0]=-1;
    while(i<lenp){
        if(j==-1 || pat[i]==pat[j]){
            i++;j++;
            next[i]=j;
        }
        else j=next[j];
    }
}

int kmp(){ //kmp()函数
    int sum=0;
    if(lenp>lens) return 0;
    else{
        int i=0,j=0;
        while(i<lens){
            if(j==-1 || str[i]==pat[j]){
                i++;j++;
            }
            else j=next[j];
            if(j==lenp){ //匹配完成一个串,将j置0,进入下一次匹配
                j=0;
                sum++;
            }
        }
        return sum;
    }
}

int str_str(){//strstr()函数
    char *p=0;
    char *k=str;
    int ans=0;
    while((p=strstr(k,pat))!=0){
        ans++;
        k=p+lenp;
    }
    return ans;
}

int main(){
    memset(str,0,sizeof(str));
    memset(pat,0,sizeof(pat));
    while(scanf("%s",&str)!=EOF && str[0]!='#'){
        scanf("%s",&pat);
        lens=strlen(str);
        lenp=strlen(pat);
        //kmp()函数
        getFail();
        int ans=kmp();
        //strstr()函数
        int ans=str_str();
        printf("%d\n",ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值