zoukankan      html  css  js  c++  java
  • KMP算法实现

    依照KMP实现的算法,附带测试用例。

    #include <algorithm>
    #include
    <iostream>
    #include
    <iterator>
    #include
    <string>
    #include
    <vector>
    #include
    <cassert>
    #include
    <cstring>
    using namespace std;


    /**计算next***/
    void kmp_next(char *pattern,int *next)
    {
    int i = 0 ;
    int j = next[0] = -1;
    while(pattern[i]!= '\0')
    {
    if((j == -1) || (pattern[i] == pattern[j]))
    next[
    ++i]= ++j;
    else
    j
    = next[j];
    }
    }
    /**计算next_val***/
    void kmp_next_val(char *pattern,int *next_val)
    {
    int i = 0;
    int j = next_val[0] = -1;
    while(pattern[i]!='\0')
    {
    if((j == -1)|| (pattern[i] == pattern[j]))
    if(pattern[++i] != pattern[++j])
    next_val[i]
    = j;
    else
    next_val[i]
    = next_val[j];
    else
    j
    = next_val[j];
    }
    }
    /****match 是长串**

    *****pattern 是模式串*
    */
    int kmp_match(char *match,char *pattern)
    {
    int m = strlen(pattern);

    int next[m];
    int i,j;
    /**打印表格**/
    for(i = 0; i < m ; ++i)
    cout
    <<i<<'\t';
    cout
    <<endl;
    kmp_next(pattern,next);
    copy(next,next
    +m,ostream_iterator<int > (cout,"\t"));
    cout
    <<endl;
    kmp_next_val(pattern,next);
    copy(next,next
    +m,ostream_iterator<int > (cout,"\t"));
    cout
    <<endl;

    i
    = j = 0;
    while((match[i]!='\0')&&(pattern[j]!='\0'))
    {
    if((j == -1)||(match[i] == pattern[j]))
    ++i,++j;
    else
    j
    = next[j];

    }
    return j == m?(i -j):-1;
    }


    int main(int argc,char *argv[])
    {
    char src[max_size];
    char dst[max_size];
    int m ,n;
    int position = 0;
    while(cin >> src >> dst)
    {
    position
    = kmp_match(src,dst);

    if(position != -1)
    cout
    <<"find at \t "<<position<<endl;
    else
    cout
    <<"not a substring\n";

    cout
    <<"--------end----------\n\n";
    }
    return 0;
    }


  • 相关阅读:
    基于Metaweblog API 接口一键发布到国内外主流博客平台
    uva144 Student Grants
    Uva 10452
    Uva 439 Knight Moves
    Uva 352 The Seasonal War
    switch语句
    java——基础知识
    我的lua学习2
    codeforces 431 D. Random Task 组合数学
    codeforces 285 D. Permutation Sum 状压 dfs打表
  • 原文地址:https://www.cnblogs.com/westfly/p/kmp_algorithm.html
Copyright © 2011-2022 走看看