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


  • 相关阅读:
    手机摇一摇代码
    ftp
    .net 设置导航的当前状态
    app 尺寸
    繁简体 互转 js
    静态页分页效果
    判断浏览器
    python列表,元组,字典和字符串之间的相互转换
    uliweb框架数据库操作
    uliweb的模版
  • 原文地址:https://www.cnblogs.com/westfly/p/kmp_algorithm.html
Copyright © 2020-2023  润新知