码迷,mamicode.com
首页 > 其他好文 > 详细

判断一个字符串中是否包含另一个字符串(KMP、BF)

时间:2014-09-16 10:35:00      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   ar   div   sp   log   c   amp   

判断一个字符串是否是另一个字符串的子串,也就是strstr()函数的实现,简单的实现方法是BF算法。

1.BF算法

int BF(char *s, char *p){
    if(s==NULL || p==NULL)return -1;
    int i=0;
    int j;
    while(i<strlen(s)){
        j=0;
        while(s[i]==p[j] && j<strlen(p)){
            i++;
            j++;
        }
        if(j==strlen(p))return i-j;
        i=i-j+1;
    }
    return -1;
}

2.KMP算法

KMP算法的原理有很多文章解释,这就不说了(我也看得不是很懂......)。整个KMP算法的关键点在于next数组的实现。

KMP算法主体:

int KMP(char *s, char *p){
    if(s==NULL || p==NULL)return -1;
    int next[100];
    get_next(next, p);
    int i=0;
    int j=0;
    while(i<strlen(s)){
        if(j==-1 || s[i]==p[j]){
            i++;
            j++;
        }else{
            j=next[j];
        }
        if(j==strlen(p))return i-j;
    }
    return -1;
}

get_next函数的实现:

void get_next(int *next, char *p){
    if(next==NULL || p=NULL)return;
    int i=0;
    int j=-1;
    next[0]=-1;
    while(i<strlen(p)-1){
        if(j==-1 || p[i]==p[j]){
            i++;
            j++;
            next[i]=j;
        }elseP{
            j=next[j];
        }
    }
}

注意,get_next函数的实现只与子字符串有关系...

判断一个字符串中是否包含另一个字符串(KMP、BF)

标签:style   blog   color   ar   div   sp   log   c   amp   

原文地址:http://www.cnblogs.com/focus1987/p/3974335.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!