首页 > 其他 > 详细

KMP算法

时间:2014-09-06 17:22:43      阅读:268      评论:0      收藏:0      [点我收藏+]

KMP算法

class KMP
{
public:
    vector<int> create_prefix_function(string s)
    {
        vector<int> next(s.size(), 0);
        next[0] = 0;
        int k = 0;
        for (int q = 1; q < s.size(); q++)
        {
            while (k > 0 && (s[k] != s[q]))
            {
                k = next[k - 1];
            }
            if (s[k] == s[q])
            {
                k = k + 1;
            }
            next[q] = k;
        }
        return next;
    }
    vector<int> match(string text, string query)
    {
        vector<int> next = create_prefix_function(query);
        vector<int> result;
        int q = 0;
        for (int i = 0; i < text.size(); i++)
        {
            while (q > 0 && (query[q] != text[i]))
            {
                q = next[q - 1];
            }
            if (query[q] == text[i])
            {
                q = q + 1;
            }
            if (q == query.size() - 1)
            {
                result.push_back(i - q + 1);
                q = next[q];
            }
        }
        return result;
    }
};

int main(int argc, char **argv)
{
    KMP kmp;
    string text = "abababacaba";
    string query = "ababaca";
    vector<int> result = kmp.match(text, query);
    
    getchar();
    return 0;
}

最后的结果为2,表示从text索引2开始匹配

KMP算法

原文:http://www.cnblogs.com/liuzhijiang123/p/3959514.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!