Chinaunix首页 | 论坛 | 博客
  • 博客访问: 520426
  • 博文数量: 118
  • 博客积分: 3995
  • 博客等级: 中校
  • 技术积分: 1276
  • 用 户 组: 普通用户
  • 注册时间: 2005-11-15 12:15
文章分类

全部博文(118)

文章存档

2014年(1)

2013年(1)

2010年(6)

2009年(27)

2008年(10)

2007年(33)

2006年(38)

2005年(2)

我的朋友

分类:

2007-10-08 21:42:51

在字符串s内搜索子串p,返回首次匹配的起始位置,否则返回-1
(1)朴素的解决办法

int search(char *s,char *p){
    int m,n,i,j,k;
    m=strlen(s);
    n=strlen(n);
    for(i=0;i<=m-n;i++)
        for(j=i,k=0;k<n && s[j]==p[k];j++,k++)
          if(k==n) return i;
    return -1;
}

(2)KMP算法

void kmp(char *,char *);
static void getnext(int *,char *,int);

void
kmp(char *s,char *p){
    int *f,m,n,i,t;
    f=(int *)malloc(sizeof(int)*n);
    getnext(f,p,n);
    for(i=0,t=0;i<m && t;){
        if(s[i]==p[t]) { i++;t++;}
        else if(t==0) i++;
        else t=f[t];
    }

    free(f);
    if(t==n) return i-n;
    return -1;
}

static void
getnext(int *f,char *p,int n){
    int i,t;
    f[0]=0;
    for(i=1,t=0;i<n;i++){
        while(t>0 && p[i]!=p[t]) t=f[t];
        if(p[i]==p[t]) f[i]=++t;
        else f[i]=0;
    }
}

阅读(1534) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~