Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15081
  • 博文数量: 9
  • 博客积分: 657
  • 博客等级: 上士
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-06 12:45
文章分类
文章存档

2011年(1)

2010年(3)

2009年(5)

分类: C/C++

2009-11-27 09:36:30

kmp算法介绍:http://www.matrix67.com/blog/archives/115


/***********************************************************
 * kmp字符串匹配算法
 **********************************************************/

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

int main(int argc,char *argv[])
{
        int m;
        int n;
        int *pi = NULL;
        int ret = 0;
        int i;
        
        if(argc != 3)
        {
                printf("usage:%s string string\n",argv[0]);
                exit(-1);
        }
                
        m = strlen(argv[1]);
        n = strlen(argv[2]);
        
        if(m < n)
        {
                printf("the first string must be longer than the second string\n");
                exit(-1);
        }
        
        pi = (int *)malloc(sizeof(int)*n);
        if(pi == NULL)
        {
                printf("malloc error!\n");
                exit(-1);
        }
        
        getPI(argv[2],n,pi);
        
        ret = kmp(argv[1],m,argv[2],n,pi);
        if(ret < 0)
        {
                exit(-1);
        }
        else
        {
                printf("match at %d\n",ret);
        }
        
        free(pi);
        pi = NULL;
        
        return 0;
}

int getPI(char *src,int len,int *arr)
{
        int i = 0;
        int j = 0;
        
        arr[0] = -1;
        for(i = 1; i < len; i++)
        {
                j = arr[i-1];
                while(j>=0 && src[i]!=src[j+1])
                {
                        j = arr[j];
                }
                
                arr[i] = (src[i]!=src[j+1] ? j : j + 1);
        }
        
        return 0;
}

int kmp(char *src,int len_src,char *dest,int len_dest,int *arr)
{
        int i = 0;
        int j = 0;
        
        for(i = 0; i < len_src; i++)
        {
                //printf("\n%s\n%s\n",src+i,dest+j);

                while(src[i] != dest[j] && j > 0)
                {
                        j = arr[j-1] + 1;
                        //printf("%s\n",dest+j);

                }
                
                j = (src[i] == dest[j]) ? j + 1 : j ;
                if( j == len_dest )
                {
                        return i-j+1;
                }
        }
        
        return -1;
}


阅读(331) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:Sed - An Introduction and Tutorial

给主人留下些什么吧!~~