KMP字符串模式匹配的C实现
2006-04-24 01:26
501 查看
申请这个BLOG很久了,可发的内容少的可怜,又一段时间没更新了,所以随便发点凑个数,呵呵。
KMP算法是字符串模式匹配的一种比较好的算法,此算法的时间复杂度为O(m+n),其中m为源字符串长度,n为目标字符串长度,此算法其实是利用目标字符串构造一个简单的自动机。因为它由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,所以人们称它为 克努特-莫里斯-普拉特操作(简称KMP算法),呵呵,第一个人非常著名,是我的偶像。
下面列出源代码清单,希望对这感兴趣的朋友与我交流。
/*
* Author : harly
* Date : 2006-4-24
**/
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
//试验KMP算法
int* computeNext(const char* pattern); //计算模式的next数组
int stringMatch(const char* src, const char* target);//普通的模式匹配函数
void print(int* pInt , int num); //输出pInt里面的元素,num为个数
int stringMatchKmp(const char* src, const char* target);
void main()
{
const char* src = "abacabcacabcabcabcattcbab";
const char* target = "abcabcabc";
//printf("%d",strlen(""));
//调用普通的字符串匹配函数
printf( "src: %s/ntarget: %s/nThe index is: %d/tBased on original algoithm/n", src, target, stringMatch(src, target) );
//调用KMP方式实现的字符串匹配函数
printf( "/nsrc: %s/ntarget: %s/nThe index is: %d/tBased on KMP algorithm/n", src, target, stringMatchKmp(src, target) );
getch();
}
//从字符串src中查找target串,如果找到就返回第一个匹配地位置,否则返回-1
int stringMatch(const char* src, const char* target)
{
int srcLen , targetLen, i, j, index;
i = j = 0;
assert( src != NULL && target != NULL);
srcLen = strlen(src);
targetLen = strlen(target);
while ( i < srcLen && j < targetLen )
{
if (src[i] == target[j] )
{
i++;
j++;
}
else
{
i = i - j +1;
j = 0;
}
}
if (j == targetLen) index = i - targetLen;
else index = -1;
return index;
}
int* computeNext(const char* pattern)
{
int len , i, nextTemp;
int *next ;
assert(pattern != NULL);
len = strlen(pattern);
if (len == 0) len =1; //应该需要这句,否则空字符串的时候就麻烦了
next = (int*)malloc( sizeof(int) * len );
next[0] = -1;
for (i = 1; i < len; i++)
{
nextTemp = next[i-1];
while (pattern[i-1] != pattern[nextTemp] && nextTemp >=0 )
{
nextTemp = next[nextTemp];
}
next[i] = nextTemp +1;
}
return next;
}
void print(int* pInt , int num) //输出pInt里面的元素,num为个数
{
int i;
printf("The next is: /n");
for (i =0; i< num; i++)
{
printf("%d ", pInt[i]);
}
}
//从字符串src中查找target串,如果找到就返回第一个匹配地位置,否则返回-1
int stringMatchKmp(const char* src, const char* target)
{
int srcLen, targetLen;
int i = 0, j = 0, index;
int *next;
assert(src != NULL && target !=NULL);
srcLen = strlen(src);
targetLen = strlen(target);
next = computeNext(target);
print(next, strlen(target) );
while (i < srcLen && j < targetLen)
{
if ( j== -1 || src[i] == target[j] )
{
// printf("/n%c,%c,%i", src[i], target[j],j);
i++;
j++;
}
else
{
j = next[j];
}
}
if (j == targetLen)
{
index = i -targetLen;
}
else
{
index = -1;
}
free(next);
return index;
}
KMP算法是字符串模式匹配的一种比较好的算法,此算法的时间复杂度为O(m+n),其中m为源字符串长度,n为目标字符串长度,此算法其实是利用目标字符串构造一个简单的自动机。因为它由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,所以人们称它为 克努特-莫里斯-普拉特操作(简称KMP算法),呵呵,第一个人非常著名,是我的偶像。
下面列出源代码清单,希望对这感兴趣的朋友与我交流。
/*
* Author : harly
* Date : 2006-4-24
**/
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
//试验KMP算法
int* computeNext(const char* pattern); //计算模式的next数组
int stringMatch(const char* src, const char* target);//普通的模式匹配函数
void print(int* pInt , int num); //输出pInt里面的元素,num为个数
int stringMatchKmp(const char* src, const char* target);
void main()
{
const char* src = "abacabcacabcabcabcattcbab";
const char* target = "abcabcabc";
//printf("%d",strlen(""));
//调用普通的字符串匹配函数
printf( "src: %s/ntarget: %s/nThe index is: %d/tBased on original algoithm/n", src, target, stringMatch(src, target) );
//调用KMP方式实现的字符串匹配函数
printf( "/nsrc: %s/ntarget: %s/nThe index is: %d/tBased on KMP algorithm/n", src, target, stringMatchKmp(src, target) );
getch();
}
//从字符串src中查找target串,如果找到就返回第一个匹配地位置,否则返回-1
int stringMatch(const char* src, const char* target)
{
int srcLen , targetLen, i, j, index;
i = j = 0;
assert( src != NULL && target != NULL);
srcLen = strlen(src);
targetLen = strlen(target);
while ( i < srcLen && j < targetLen )
{
if (src[i] == target[j] )
{
i++;
j++;
}
else
{
i = i - j +1;
j = 0;
}
}
if (j == targetLen) index = i - targetLen;
else index = -1;
return index;
}
int* computeNext(const char* pattern)
{
int len , i, nextTemp;
int *next ;
assert(pattern != NULL);
len = strlen(pattern);
if (len == 0) len =1; //应该需要这句,否则空字符串的时候就麻烦了
next = (int*)malloc( sizeof(int) * len );
next[0] = -1;
for (i = 1; i < len; i++)
{
nextTemp = next[i-1];
while (pattern[i-1] != pattern[nextTemp] && nextTemp >=0 )
{
nextTemp = next[nextTemp];
}
next[i] = nextTemp +1;
}
return next;
}
void print(int* pInt , int num) //输出pInt里面的元素,num为个数
{
int i;
printf("The next is: /n");
for (i =0; i< num; i++)
{
printf("%d ", pInt[i]);
}
}
//从字符串src中查找target串,如果找到就返回第一个匹配地位置,否则返回-1
int stringMatchKmp(const char* src, const char* target)
{
int srcLen, targetLen;
int i = 0, j = 0, index;
int *next;
assert(src != NULL && target !=NULL);
srcLen = strlen(src);
targetLen = strlen(target);
next = computeNext(target);
print(next, strlen(target) );
while (i < srcLen && j < targetLen)
{
if ( j== -1 || src[i] == target[j] )
{
// printf("/n%c,%c,%i", src[i], target[j],j);
i++;
j++;
}
else
{
j = next[j];
}
}
if (j == targetLen)
{
index = i -targetLen;
}
else
{
index = -1;
}
free(next);
return index;
}
相关文章推荐
- KMP字符串模式匹配算法实现
- KMP-字符串模式匹配(c++/python实现)
- KMP字符串模式匹配算法实现
- KMP字符串模式匹配算法实现(php)
- KMP字符串模式匹配算法实现
- java实现字符串的一般和KMP模式匹配算法
- KMP字符串模式匹配算法Java实现
- KMP字符串模式匹配算法实现
- KMP字符串模式匹配算法实现
- KMP字符串模式匹配详解
- c/c++程序之_KMP字符串模式匹配详解
- KMP字符串模式匹配详解
- 字符串的模式匹配(朴素匹配、KMP)
- 算法(四)KMP字符串模式匹配详解
- KMP模式匹配算法中next,nextval的分别实现
- 字符串普通模式匹配和KMP模式匹配[面相对象喽]
- 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
- KMP字符串模式匹配详解
- KMP字符串模式匹配详解
- KMP字符串模式匹配详解