题目大意:给出一个字符串,以及模板串,求字符串中有多少个模板串即子串?
解题思路:该题有两种做法,一是直接利用库函数中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;
}