Chinaunix首页 | 论坛 | 博客
  • 博客访问: 340659
  • 博文数量: 88
  • 博客积分: 2011
  • 博客等级: 大尉
  • 技术积分: 885
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-21 14:50
文章分类

全部博文(88)

文章存档

2010年(88)

我的朋友

分类: C/C++

2010-09-24 23:17:22

/*
 * Description:
 *          KMP字符串搜索算法。
 * Author  :FinL
 * Language: C
 * Date    : 2010-09-24
 */

#include
#include
#include
 
static void ComputePrefixFunction(const char *pattern, int *next)
{
    int i = 0;
    int j = -1;
 
    next[0] = -1;
    while (i
    {
        if (-1 == j || pattern[i] == pattern[j])
        {
            ++i;
            ++j;
            next[i] = j;    
        }
        else
            j = next[j];
    }
}


char * KmpMatch(const char *target, const char *pattern)
{
    int i = 0,j=0;
    int targetlen,patternlen;
    int *next = NULL;
    
    targetlen = strlen(target);
    patternlen = strlen(pattern);
 
    next = (int *)malloc(patternlen * sizeof(int));
    if (NULL == next)
        return NULL;
 
    ComputePrefixFunction(pattern, next);
 
    while (i < targetlen && j < patternlen)
    {
        if (-1 == j || target[i] == pattern[j])
        {
            ++i;
            ++j;
        }
        else
            j = next[j];
    }

    free(next);
    next = NULL;
 
    if (j >= patternlen)
        return (char *)&target[i - patternlen];
    else
        return NULL;
}
 

int main()
{
    char *target = "abababaababacb";
    char *pattern = "ababacb";
    char *p = NULL;
 
    printf("Target    : %s\nPattern : %s\n", target, pattern);
    p = KmpMatch(target, pattern);
    if (p)
        printf("Pattern found at position : %d\n", p - target + 1);
    else
        printf("Pattern not found!\n");
return 0;
}
阅读(1129) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-26 15:40:49

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com