KMP算法(C语言实现)

 KMP算法,详细讲解可参考视频:https://www.bilibili.com/video/av3246487?from=search&seid=15034383192931240426 

我认为 KMP算法中最重要的便是理解next数组,理解为何它就减少了计算量。建议在看视频的过程中手算next数组,然后再写代码。

程序说明:如果主串包含了模式串则打印:匹配成功,反之:匹配失败。

不多讲,有缘人自懂,如果有缘人发现其中有bug的话请告知一声,家境贫寒,搬砖去了,告辞!

#include 
#include 

const int TRUE = 1;
const int FALSE = 0;

int Index_KMP(char* S, char* T, int pos);

int main()
{
	char text[100];
	char pattern[10];
	int start_position;
	
	printf("\n输入主串:");
	gets(text);
	
	printf("\ntext:%s", text);
	printf("\n输入模式串:");
	gets(pattern);
	printf("\n输入匹配的起始位置:");
	scanf("%d", &start_position);
	
	if(Index_KMP(text, pattern, start_position) == TRUE)
	{
		printf("\n匹配成功!");	
	}	
	else
	{
		printf("\n匹配失败!");
	}
	return 0;
}

int Index_KMP(char *text, char *pattern, int pos)//pos最小值为0 
{
	int length;
	length = strlen(text);
	
	//建立next[]数组
	int next[length];
	int i, j, k;
	j = 0;
	i = 1;
	k = 0;
	next[0] = 0;
	
	//给next[]数组赋值 
	while(i < length)
	{
		if(pattern[i] == pattern[j])
		{
			next[i] = j + 1;
			i++;
			j++;	
		}
		else
		{
			if(j == 0)
			{
				next[i] = 0;
				i++;
				continue;
			}
			j = next[j - 1];
		}
	}
	
	printf("\nlength:%d", length);
	
	//开始匹配主串
	for(int i = pos, j = 0; i < length; )
	{
		printf("\nj in pattern:%d ", j);
		printf("\ni in text:%d\n", i); 
		if(text[i] == pattern[j])
		{
			i++;
			j++;
			if(j == strlen(pattern))
			{
				return TRUE;
			}
		}
		else
		{
			if(j == 0)
			{
				i++;
				continue; 
			}
			j = next[j - 1];
		}
	} 
	
	return FALSE;
}

 

 

你可能感兴趣的:(数据结构基础)