kmp

  简略的写了一个,可能有问题,之后学习编译原理的时候应该会使用,到时候在修改。

  kmp.h

#include <string>
using namespace std;
class Kmp
{
private:
	string modelstr;
	string mainstr;
	int *next;
	bool findnext();
public:
	Kmp(const string& modstr,const string& mnstr);
	~Kmp();
	void shownext();
	int substr();
};

 kmp.cpp

#include "kmp.h"
#include <iostream>

using namespace std;
Kmp::Kmp(const string& modstr,const string& mnstr):modelstr(modstr),mainstr(mnstr)
{
	next=new int[modelstr.length()];
	findnext();
}
Kmp::~Kmp()
{
	delete []next;
}
bool Kmp::findnext()
{
	unsigned s=0,t=0;
	if(!next)
		return false;
	next[0]=0;
	for(s=1,t=0;s<modelstr.length();s++)
	{
		while(t>0&&modelstr[s]!=modelstr[t])
			t=next[t-1];
		if(modelstr[s]==modelstr[t])
		{
			t++;
			next[s]=t;
		}
		else
			next[s]=0;				
	}
	return true;
}
int Kmp::substr()
{
	unsigned s=0,i=0;		//i是文本串指针,s是模式串指针;
	if(!next)
		return -1;
	for(i=0,s=0;i<mainstr.length();i++)
	{
		while(s>0&&mainstr[i]!=modelstr[s])
			s=next[s-1];
		if(mainstr[i]==modelstr[s])
			s++;
		if(s==modelstr.length())
			return i-s+1;
	}
	return -1;
}
void Kmp::shownext()
{
	int i=0;
	for(i=0;i<modelstr.length();i++)
		cout<<next[i]<<' ';
}

 main.cpp

#include <iostream>
#include <string>
#include "kmp.h"
using namespace std;

int main(void)
{
	string modstr="hehe";
	string mnstr="sssdfefxhehe";
	Kmp kmp(modstr,mnstr);
	cout<<kmp.substr()<<endl;
	kmp.shownext();
	return 0;
}

 

posted @ 2012-10-17 21:48  fateのcaster  阅读(201)  评论(0编辑  收藏  举报