Description
输入一个主串和一个子串,若匹配成功,则找出匹配的趟数和在子串在主串中的位置,若匹配不成功,则输出0
Input
输入两个字符串
Output
输出匹配的趟数和位置
Sample Input
ababcabcacbab abcacSample Output
3 6代码:
#include <iostream>
#include <cstring>
using namespace std;
int len,lens;
void getnext(char str[],int next[])
{
int i,j;
i=1;j=0;
next[1]=0;
while(i<=len)
{
if(j==0||str[i]==str[j])
{
++i;++j;
next[i]=j;
}
else
j=next[j];
}
}
int kmpindex(char s[],char str[])
{
int i,j,p;
i=1;j=1;p=1;
int next[10000];
getnext(str,next);
while(i<=lens&&j<=len)
{
if(j==0||s[i]==str[j])
{
i++;
j++;
}
else
{
j=next[j];
p++;
}
}
if(j>len)
return p;
}
int kmpindex1(char s[],char str[])
{
int i,j,p;
i=1;j=1;p=1;
int next[10000];
getnext(str,next);
while(i<=lens&&j<=len)
{
if(j==0||s[i]==str[j])
{
i++;
j++;
}
else
{
j=next[j];
//p++;
}
}
if(j>len)
return i-len;
else
return 0;
}
int main()
{
char str[10000];
char s[100000];
int i,j;
cin>>s;
cin>>str;
lens=strlen(s);
len=strlen(str);
for(j=len;j>0;j--)
str[j]=str[j-1];
int k;
for(k=lens;k>0;k--)
{
s[k]=s[k-1];
}
int num;
num=kmpindex(s,str);
int num1=kmpindex1(s,str);
if(num1!=0)
{
cout<<num<<' '<<num1<<endl;
}
else
cout<<num1<<endl;
return 0;
}
解法二:
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=10005;
const int maxn1=100005;
int lens,lent;
void getnext(char t[],int next[])
{
int i,j;
i=0;
j=-1;
next[0]=-1;
while(i<lent)
{
if(j==-1||t[i]==t[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
void numkmp(char s[],char t[],int &k,int &p)
{
int i,j;
i=0;j=0;
int next[maxn];
getnext(t,next);
while(i<lens&&j<lent)
{
if(j==-1||s[i]==t[j])
{
i++;
j++;
}
else
{
j=next[j];
k++;
}
}
if(j>=lent)
{
p=i-lent;
}
else
k=0;
}
int main()
{
char s[maxn1];
char t[maxn];
int i,j;
cin>>s;
lens=strlen(s);
cin>>t;
lent=strlen(t);
int num=1;
int locat=-1;
numkmp(s,t,num,locat);
if(locat!=-1)
cout<<num<<' '<<locat+1<<endl;
else
cout<<0<<endl;
return 0;
}