串算法 - KMP算法

版本一

#include <iostream>
using namespace std;

int* buildNext(char* pattern)
{
	size_t m = strlen(pattern), j = 0;// "主"串指针
	int* nTable = new int[m]; // next table
	int t = nTable[0] = -1;
	while(j < m-1)// 0 ~ m-1 arrary
	{
		if (0 > t || pattern[j] == pattern[t])
		{
			j++; t++;
			nTable[j] = t;
		}
		else
			t = nTable[t];
	}
	return nTable;
}

int match(char* pattern, char* t)
{
	int* next = buildNext(pattern);// 构造next表
	int n = strlen(t), i = 0;
	int m = strlen(pattern), j = 0;
	while(j < m && i < n)  
	{  
		if (0 > j || t[i] == pattern[j])// 匹配  
		{     
			i++; j++;// 转到下一对字符  
		}  
		else  
		{  
			j = next[j];// 模式串右移(主串不回退)
		}
	} 
	delete [] next;
	return i - j;
}

int main()
{
	char* t = "abcdefghijklmnopqrstuvwxyz0123456789";
	char* pattern = "123";

	int index = match(pattern, t);
	cout << index << endl;
	return 0;
}


猜你喜欢

转载自blog.csdn.net/devillixin/article/details/51890771