kmp算法

Posted ~千里之行,始于足下~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kmp算法相关的知识,希望对你有一定的参考价值。

数据结构_串

对于串,今天就总结了一个算法,关于字符串的模式匹配问题(重点在于kmp算法).
普通的模式匹配算法,当匹配不成功时需要将主串的下标恢复到之前匹配的下一个字符,子串下标置为串首;而kmp算法则不需要重置主串的下标,只需要改变子串的下标(而这个改变的准则就是next数组)

#include<stdio.h>
#include<Windows.h>
/*返回字串t在pos之后主串s中的位置 未找到返回0*/
int Index(char * s, char * t, int pos)
{
	int i = pos;
	int j = 1;
	int len1 = s[0] - '0';
	int len2 = t[0] - '0';
	printf("%s\\n", s);
	printf("%s\\n", t);
		while (i <= len1 && j <= len2)
		{
			if (s[i] == t[j])
			{
				i++;
				j++;
			}
			else
			{
				i = i - j + 2;
				j = 1;
			}
		}

		if (j > len2)
		{
			return i - len2;
		}
		else
			return 0;
	
}

/*kmp模式匹配算法*/

//求next数组
void getNext(char * p, int next[])
{
	int pLen = strlen(p);
	next[0] = -1;
	int i = -1;
	int j = 0;
	while (j < pLen - 1)
	{
		if (i == -1 || p[i] == p[j])
		{
			++i;
			++j;
			next[j] = i;
		}
		else
		{
			i = next[i];
		}
	}
}

int kmpSearch(char * p, char * s, int next[])
{
	int pLen = strlen(p);
	int sLen = strlen(s);
	int i = 0;
	int j = 0;
	while (i < pLen && j < sLen)
	{
		if (j == -1 || p[i] == s[j])
		{
			++i;
			++j;
		}
		else
		{
			j = next[j];
		}
	}
	if (j == sLen)
	{
		return i - j;
	}
	else
		return -1;
}

test代码

#define _CRT_SECURE_NO_WARNINGS 1
#include"my_string.h"
int main()
{
	// test Index()
	/*char * s = (char*)malloc(20 * sizeof(char));
	char * t = (char*)malloc(20 * sizeof(char));
	gets(s);
	printf("%d\\n", Index(s, t, 1));
	gets(t);*/

	//test getNext()
	int next[9] = { -100 };
	getNext("DABCDABDE",next);
	/*for (int i = 0; i < 9; i++)
	{
		printf("%d ", next[i]);
	}*/
	printf("%d\\n", kmpSearch("DABCDABDE","CD",next));
	

	system("pause");
	return 0;
}

更详细的解释参考详解kmp算法

以上是关于kmp算法的主要内容,如果未能解决你的问题,请参考以下文章

数据结构—串KMP模式匹配算法

Python ---- KMP(博文推荐+代码)

KMP算法及Python代码

KMP算法及Python代码

图解KMP算法原理及其代码分析

Kmp算法Java代码实现