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;
    }


  • 相关阅读:
    Cocos2d-x移植Android 常见问题处理办法
    JSON解析问题
    类图(Rose)
    Linux_脚本——使用echo从一个文件写入还有一个文件末尾
    Android HttpClient自己主动登陆discuz论坛!
    Swift编程语言学习1.1——常量与变量
    DVR_RDK编译报错
    啊马蜂蜜哦我阿达十米台内又热偶爱
    贪婪算法之兑换硬币及问题所在
    00095_流的操作规律
  • 原文地址:https://www.cnblogs.com/westfly/p/kmp_algorithm.html
Copyright © 2011-2022 走看看