查找q是否在p中。先对q进行特征统计。。。
比较挫的代码先贴上,以后有精力再改进改进。
#include<iostream>
using namespace std;
/**
统计字串的特征
比如字串为 const char *q="abcabcd"
特征表为
int table[]={-1,0,0,0,1,2,3};
*/
int * createTable(const char *q)
{
if(q==NULL)
return NULL;
int len=strlen(q);
int *table = new int[len+1];
table[0]=-1;
table[1]=0;
int i;
for(i=2;i<len;i++)
{
int j=i/2;
while(j>0)
{
int k;
for(k=0;k<j;k++)
{
if(q[k]!=q[i-j+k])
break;
}
if(k==j)
{
table[i]=j;
break;
}
else
j--;
}
if(j==0)
table[i]=0;
}
return table;
}
/*
查找q在p中第一次出现的位置;
*/
const char * findstr(const char *p, const char *q)
{
if(p==NULL || q==NULL)
return NULL;
int len1 = strlen(p);
int len2 = strlen(q);
if(len1<len2)
return NULL;
int i=0;
int j=0;
int *table = createTable(q);
while(i<len1)
{
while(i<len1 && j<len2 && p[i]==q[j])
{
i++;
j++;
}
if(j==len2)
return p+i-len2;
else
j=table[j];
if(j==-1)
{
i++;
j=0;
}
}
return NULL;
}
int main()
{
char *p="abcabceabcabcdefabcabcabcddd";
char *q="abcabcabcd";
cout<<findstr(p,q)<<endl;
return 0;
}