KMP算法-字符串匹配

来源:互联网 发布:java程序员必看的书籍 编辑:程序博客网 时间:2024/06/05 02:33

先看看普通字符串匹配BF算法。

BF算法

BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。

代码实现:

int BFMatch(string s,string p){    int i,j;    for(i=0;i<s.length();i++){        j=0;        while(j<p.length() && s[i]==p[j]){            i++;            j++;        }        if(j==p.length()){            return i-p.length();        }        i=i-j+1;    }    return -1;}

KMP算法

原理介绍可以看篇文章:
http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html

大概思想就是:不匹配时,模式串的指针不是移动一步,而是根据部分匹配值来移动。
这里写图片描述
这里写图片描述
这里写图片描述

代码:

//生成串p的部分匹配值vector<int> getMatch(string p){    auto len=p.length();    vector<int> match(len,-1);    match[0]=0;    for(int i=1,k=0;i<p.length();i++){        while(k>0 && p[i]!=p[k]){            //k对应的串往后移动(已匹配长度-部分匹配值),并且定位到部分匹配长度位置。            //因为i不变,k更新到match[k-1]            k=match[k-1];        }        if(p[i]==p[k]) {            k++;        }        match[i]=k;    }    return match;}//找出s中p的所有匹配,返回每个匹配的首地址vector<int> KMPMatch(string s,string p){    vector<int> ret;    vector<int> match=getMatch(p);    for(int i=0,k=0;i<s.length();i++){        while(k>0 && s[i]!=p[k]){            k=match[k-1];        }        if(s[i]==p[k]){            k++;        }        if(k==p.length()){            ret.push_back(i+1-p.length());   //返回s中匹配p的所有首地址            k=match[k-1];        }    }    return ret;}
0 0