KMP字符串匹配

来源:互联网 发布:软件部门管理制度 编辑:程序博客网 时间:2024/05/23 00:58

思路

        判断s中是否含有字符串t。

        一般思路为:从s中首字符开始,依次与t中进行比对,直到t结尾或者某一个位置两者不同 。如果到t的结尾,则表示s中含有t。如果有一个位置不相同,那么从s中下一个字符开始,再次与t中字符比对。如下:

    i = 0,j = 0;    for(;i<pl;i++){//pl为p字符串的长度,依次遍历它的每一个字符串        int start = i;//记录此时开始比较的字符串的下标        while(i<pl && j<len){//len子串的长度            if(p[i] == s[j]){                i++;                j++;            }else{                i = start;                j = 0;                break;            }        }        if(j >= len){            printf("%d ",start);            j = 0;            break;        }    }

        这样的比较,每一次遇到不同的时候都需要将i重新归位,而KMP算法就是为避免此种情况的。

        KMP算法,不需要将i进行移位,只需要将子串往右移一定的位数。

代码

    char* p = "ioabaabcacvaa";    char* s="abaabcac";    int len = (int)strlen(s);    int next[len];    next[0] = -1;//如果此时仍不匹配,就需要比对下一个字符    int j = -1;    int i = 0;    while(i < len){        if(j == -1 || s[i] == s[j]){            j++;            i++;            next[i]=j;        }else{            j = next[j];        }    }    i = 0,j = 0;    int pl = (int)strlen(p);    while(i < len && j<pl){        if(i == -1 || s[i] == p[j]){            j++;            i++;        }else{            i = next[i];        }    }    if(i>=len){        printf("%d ",j - len);    }


0 0