字符串模式匹配


#include<assert.h>

#include<iostream>

#include<fstream>

#include<time.h>

#include<stack>

#include<string>

using namespace std;



inline  unsigned __int64 getclock()
 
{

	__asm

	{

		rdtsc;

	}

}



const char Min='a';

const int characters=26;

int *shiftTable=new int[characters];

//žùŸÝģʜarrŽŽœšÒÆλ±í

//@param  arr,³€¶ÈΪmµÄģʜ×ÖŽ® 



void shiftTalble(char *& const arr,int m)

{

	for(int i=0;i<characters;i++)

	{

		shiftTable[i]=m;

	}

	for(int i=0;i<m-1;i++)

	{

		shiftTable[arr[i]-Min]=m-1-i;

	}

}

//ÔÚtext×Ö·ûŽ®ÖвéÕÒarr

//@param  text£¬³€¶ÈΪnµÄÎıŸ   arr,³€¶ÈΪmµÄģʜ

//Èç¹û³É¹Š£¬·µ»ØÆ¥ÅäµÄÊ××ÖĞλÖ㬠Èç¹û²»³É¹Š£¬·µ»Ø-1

int find( char *& const text,int n,char *& const arr,int m)

{

	assert(text!=NULL&&arr!=NULL);

	shiftTalble(arr,m);

	int i=m-1;

	int j;

	int k;

	while(i<n)

	{

		j=m-1;

		k=i;

		while(j>=0&&text[k]==arr[j])

		{

			j--;

			k--;

		}

		if(j<0)  //find 

		{

			return k+1;

		}

		else

		{

			i+=shiftTable[text[i]-Min];

		}

	}

	return -1; //fail

}

int main()

{

	



	srand((unsigned int) time(0));

	int n=rand()%250+250;

	int m=8;

	char *text=new char [n];

	int i;

	for( i=0;i<n/2;i++)

	{

		text[i]=Min+rand()%characters;

	}

	text[i++]='m';

	text[i++]='a';

	text[i++]='z';

	text[i++]='h';

	text[i++]='e';

	text[i++]='n';

	text[i++]='g';

	for(;i<n-1;i++)

	{

		text[i]=Min+rand()%characters;

	}

	text[n-1]='\0';

	

	char *arr=new char[m];

	/*for(int i=0;i<m-1;i++)

	{

		arr[i]=Min+rand()%characters;

	}

	arr[m-1]='\0';*/

	arr="mazheng";

	cout<<text<<endl;

	cout<<arr<<endl;

	int start=getclock();

	int f1=find(text,n-1,arr,m-1);

	int final=getclock();

	cout<<f1<<"   "<<final-start<<endl;

	string s=text;

	string p=arr;

	start=getclock();

	int f2=s.find(arr);

	final=getclock();

	cout<<f2<<"  "<<final-start<<endl;

	

	

	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值