【无浪】串之KMP算法一


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


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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值