关闭

测试下

279人阅读 评论(0) 收藏 举报

kmp 小程序

void caculateNext(const char* p, int len, int* next)
{
	if(p == NULL || strlen(p) != len )
	{
		return;
	}

	memset(next, 0, len*sizeof(int));

	next[0] = -1;

	int i = 2, k;

	while(i<len)
	{
		for(k=next[i-1]; k != -1; k = next[k])
		{
			if(p[k] == p[i-1])
			{
				next[i] = next[i-1] + 1;
				break;
			}
		}
		i++;
	}
}

const char* kmp(const char* str, const char* pattern)
{
	if(str == NULL || pattern == NULL || strlen(pattern) > strlen(str))
		return NULL;

	int len = strlen(str);
	int patternlen = strlen(pattern);

	int* next = new int[patternlen];

	caculateNext(pattern, patternlen,next);

	int i=0, j= 0;
	while(i<len && j<patternlen)
	{
		if(j == -1 || str[i]==pattern[j])
		{
			i++;
			j++;
		}
		else
		{
			j = next[j];
		}
	}
	if(j >= patternlen)
		return &(str[i-j]);
	return NULL;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6469次
    • 积分:147
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:4篇
    • 译文:1篇
    • 评论:1条
    文章分类
    最新评论