感觉数据结构不能当一门课程去学,要当工作去做。
KMP算法之一按照定义来做的。
#include<iostream>
#include<string>
using namespace std;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define Status int
class String{
protected:
int length;
string str;
public:
string getstr(){return str;}
Status StrAssign(string chars)
{
str=chars;
length=chars.length();
return OK;
}
Status Strcopy(String S)
{
str=S.getstr();
length=S.getstr().length();
return OK;
}
Status StrCompare(String T)
{
if(length>T.length)return 1;
else
if(length<T.length)return -1;
else return 0;
}
Status StrLength()
{
return length;
}
Status StrClear()
{
str="";
length=0;
return OK;
}
Status Concat(String S1,String S2)
{
str=S1.getstr()+S2.getstr();
length=S1.StrLength()+S2.StrLength();
return OK;
}
String SubString(int pos,int len)
{
if((pos<1||pos>length)||(len<pos||len>length)){String empty;empty.StrAssign("");return empty;}
String sub;
int i;
string temp;
for(i=pos-1;i<len;i++)
{
temp+=str[i];
}
sub.StrAssign(temp);
return sub;
}
Status Index(String T,int pos)
{
int i=pos,j=1,m,n;
int *next=setnext(T.getstr());
while(i<=length && j<=T.StrLength())
{
if(j!=0)
{
cout<<endl;
for(m=0;m<length;m++)
{
cout<<str[m]<<" ";
}
cout<<endl;
for(n=0;n<i-j;n++)
{
cout<<" ";
}
for(n=0;n<T.StrLength();n++)
{
cout<<T.getstr()[n]<<" ";
}
cout<<endl;
for(n=0;n<i-j;n++)
{
cout<<" ";
}
for(n=1;n<=T.length;n++)
{
cout<<next[n]<<" ";
}
}
if(j==0||str[i-1]==T.getstr()[j-1]){++i;++j;}
else j=next[j];
}
cout<<endl;
if(j>=T.StrLength())return i-T.StrLength();
else return 0;
}
int* setnext(string str)
{
string str1="",str2="";
int *next=new int[str.length()+1];
int sum=2;
bool judge;
next[0]=0;next[1]=0;
int i,k,j;
for(j=2;j<str.length()+1;j++)
{
judge=false;
for(k=2;k<j;k++)
{
str1="";
str2="";
for(i=1;i<=k-1;i++)
{
str1+=str[i-1];
}
for(i=j-k+1;i<=j-1;i++)
{
str2+=str[i-1];
}
if(str1==str2)
{
next[j]=k;
judge=true;
}
}
if(!judge)next[j]=1;
}
return next;
}
void display()
{
cout<<str<<endl;
}
};
int main()
{
// 0 1 1 2 2 3 4 3 4 5
String text;
text.StrAssign("aaaabababac");
String text1;
text1.StrAssign("abac");
cout<<text.Index(text1,1)<<endl;
return 0;
}