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算法的主要内容,如果未能解决你的问题,请参考以下文章