kmp字符匹配算法 c语言

4 篇文章 0 订阅
1 篇文章 0 订阅
// 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;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值