思路不说了,也不分析了,自己看数据结构的书p80~p84
这里贴下代码就是了,另外推荐学习这节内容的一些好资料
这个有点多,可以说是比较啰嗦,但是很详细,讲了有好久
还有类似的相关代码的实现,全部在我的资源里面
下面的是求next的代码
void get_next(char *t)
{
int j=1,k=0;
next[1]=0;
while (j<=t[0])
{
if (k==0||t[j]==t[k])
{
++j,++k;
next[j]=k;
}
else
{
k=next[k];
}
}
}
但是这个还没有完全优化,就是 模式串有字符重复的时候例如:
主串s:aaabaaaab
模式串:aaaab
在这里 由于模式串前面的相同,程序在运行到i=4时,可以直接跳过后面四个a,就是这里做了一点优化
下面是优化后的代码
void get_nextval(char *t)
{
int i=1;
nextval[1]=0;
int j=0;
while (i<t[0])
{
if (j==0||t[i]==t[j])
{
++i;
++j;
if (t[i]!=t[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
{
j=nextval[j];
}
}
}
最后是整个程序的代码:
#include <iostream>
using namespace std;
#include <string.h>
int *nextval=new int[1005];
int Run(char *s,char *t,int pos)
{
int i=pos,j=0;
while (i<=s[0]&&j<=t[0])
{
if (j==0||s[i]==t[j])//
{
++i,++j;
}
else
{
j=nextval[j];
}
}
if (j>t[0])
return i-t[0];
else
return 0;
}
void get_nextval(char *t)
{
int i=1;
nextval[1]=0;
int j=0;
while (i<t[0])
{
if (j==0||t[i]==t[j])
{
++i;
++j;
if (t[i]!=t[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
{
j=nextval[j];
}
}
}
int main()
{
char s[1002],t[1002];
while (cin>>s>>t)
{
int i=0,len1=strlen(s),len2=strlen(t);
for (i=len1; i>=0; i--)
s[i+1]=s[i];
s[0]=len1;
for (i=len2; i>=0; i--)
t[i+1]=t[i];
t[0]=len2;
get_nextval(t);
cout<<"出现的位置是:"<<Run(s,t,0)<<endl;
/*for (i=Run(s,t,1); len2--; i++)
cout<<s[i];
cout<<endl;*/
}
delete []nextval;
return 0;
}