题目大意:剪出多少个子串
思路:其实朴素的字符串子串查找也是可以过的,因为是O( len(S)*len(T) )的时间效率,但是KMP更快O( len(S)+len(T) )!
AC program:
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
char s[1005],t[1005];
int next[1005];
int len1,len2;
void get_next()
{
int i=1,j=0;
next[1]=0;
while(i<=len2)
{
if(j==0 || t[i]==t[j]){i++; j++; next[i]=j;}
else j=next[j];
}
}
void kmp()
{
int i=1,j=1,cnt=0;
while(i<=len1)
{
//由于是非重复数据,所以j要退回到1就行了,从头匹配
if(j==0 || s[i]==t[j]){ i++;j++; if(j>len2){ cnt++; j=1;} }
else j=next[j];
}
printf("%d\n",cnt);
}
int main()
{
//从s+1,和t+1开始是为了后续的方便
while(scanf("%s",s+1)!=EOF && s[1]!='#' && scanf("%s",t+1)!=EOF)
{
len1=strlen(s+1);
len2=strlen(t+1);
get_next();
kmp();
}
system("pause");
return 0;
}
STL:
# include<iostream>
# include<string>
using namespace std;
int main()
{
int cnt,index;
string s1,s2;
while(cin>>s1&&s1!="#")
{
cin>>s2;
index=cnt=0;
while((index=s1.find(s2,index))!=string::npos)
{
cnt++;
index+=s2.size();
}
cout<<cnt<<endl;
}
return 0;
}