您的位置:首页 > 其它

KMP算法 C实现

2014-11-21 19:39 260 查看
KMP Code:

/******************************************************************
* Theme:         KMP算法
* Content:
* Language:      C
* Author:        Aesthetic92
* Description:
******************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void get_next(char s[], int next[])
{
int i, j, len;
i = 0;
j = -1;
len = strlen(s);
next[0] = -1;
while(i < len)
{
if(j == -1 || s[i] == s[j])
{
++i;
++j;
next[i] = j;
}
else
{
j = next[j];
}
}
}

///优化的next数组
void get_nextval(char s[], int nextval[])
{
int i, j, len;
i = 0;
j = -1;
len = strlen(s);
nextval[0] = -1;
while(i < len)
{
if(j == -1 || s[i] == s[j])
{
++i;
++j;
if(s[i] != s[j])
{
nextval[i] = j;
}
else
{
nextval[i] = nextval[j];
}
}
else
{
j = nextval[j];
}
}
}

int kmp(char s[], char t[])
{
int i, j, next[255];
int s_len, t_len;
i = 0;
j = 0;
s_len = strlen(s);
t_len = strlen(t);
get_next(t, next);
///get_nextval(t, next);

while(i < s_len && j < t_len)  /// j 指向最后一个元素的坐标比数组长度小1
{
if(j == -1 || s[i] == t[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}
if(j >= t_len)
{
return i - t_len;
}
else
{
return 0;
}
}

int main()
{
char src[255] = "ABCABCABCD";  /// 空格也算
char des[255] = "ABCABCD";
int index, pos;
index = kmp(src, des);
printf("%d\n", index);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: