kmp字符匹配算法 c語言

// KMP.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "string.h"
/**
* 產生一個數組prefixArray,該數組指明:當pattern直到第i個字符匹配但下一個字符不匹配時,
* pattern應該如何向前移動使得匹配前綴尺寸最大,prefixArray[i]移動後pattern匹配前綴的最大索引
* 這樣向前移動個數爲i-prefixArray[i]
*/
bool prefixGen(char *pattern,int patternLen,int *prefixArray){
	int i;
	if(patternLen <= 0)
		return false;
	prefixArray[0] = -1;
	int k = -1;//前一次的匹配前綴的最大索引
	for(i=1;i<patternLen;i++){
		while (k >= 0 && pattern[k+1] != pattern[i]){
			k = prefixArray[k];
		}

		if (pattern[k+1] == pattern[i]){
			k++;
		}

		prefixArray[i] = k;
	}
	return true;
}

bool kmp(char *text,int *prefixArray,char *pattern){
	int k = -1;//匹配前綴最大索引
	for(int i=0;i < strlen(text); i++){
		while( k >=0 && pattern[k+1] != text[i]){
			k = prefixArray[k];
		}

		if (pattern[k+1] == text[i]){
			k++;
		}

		if(k == strlen(pattern)-1){
			printf("matching at %d offset\n",i-k);
			k = prefixArray[k];
			
		}
	}
	return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
	char *pattern = "ababaca";
	char *text = 
		"ababaca13r4u09iojklsjkhfkjsjofpfioworeababacawrewfk;,mkjjkcvjxzovioidskababacafkjjvjcxvkoaffiodsfababacaababacaskjvjxcvnjcbvfkjkjfskfksfkjsababacajxvjcxvdjdsfkjfkdsfkababaca";
	int *prefix = new int[strlen(pattern)];
	//printf("%d\n",strlen(pattern));
	prefixGen(pattern,strlen(pattern),prefix);
	printf("\n");
	for (int i = 0; i<strlen(pattern);i++){
		printf("%d ",prefix[i]);
	}
	printf("\n");
	kmp(text,prefix,pattern);
	delete [] prefix;
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章