【无浪】串之KMP算法一

来源:互联网 发布:js仿网易新闻导航栏 编辑:程序博客网 时间:2024/06/10 09:20


感觉数据结构不能当一门课程去学,要当工作去做。


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 intclass 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;elseif(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 5String text;text.StrAssign("aaaabababac");String text1;text1.StrAssign("abac");cout<<text.Index(text1,1)<<endl;return 0;}


0 0