zoukankan      html  css  js  c++  java
  • KMP 字符串匹配算法

    #include "stdafx.h"
    #include 
    <string.h>
    #include 
    <iostream>
    #include 
    <vector>
    using namespace std ;

    //模式匹配,kmp算法,复杂度O(m+n)
    //返回匹配位置,-1表示匹配失败,传入匹配串和模式串和长度
    //可更改元素类型,更换匹配函数

    #define MAXN 
    100
    #define _match(a,b) ((a)
    ==(b))
    typedef 
    char elem_t;

    int kmp_match(int ls,elem_t* str,int lp,elem_t* pat)
    {
        
    int fail[MAXN]={-1}, i=0,j;
        
    for (j=1;j<lp;)
        
    {
            
    if(pat[i]!=pat[j] )
            
    {
               fail[j
    ++]=-1 ;
               
    continue ;
            }

            
    for(i=0; j<lp && _match(pat[i],pat[j]) ; fail[j++]=i++) ;    
        }


        
    for (i=j=0;i<ls&&j<lp;i++)
        
    {
            
    if (_match(str[i],pat[j]))
                j
    ++;
            
    else if (j)
                j
    =fail[j-1]+1,i--;
        }

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


    int kmp(string  str1, string  str2)
    {
        
    if(str1.size()<str2.size())
            
    return -1 ;
        size_t i, j ;
        vector
    <int> fail ;
        fail.resize(str2.size(),
    -1) ;

        
    for(j=1, i=0; j<str2.size(); ++j)
        
    {
            
    if(str2[j]!=str2[i])
                
    continue ;
            
    for(i=0; j<str2.size() && str2[j]==str2[i] ; fail[j++]=i++) ;
            
    --j ;
        }

        
    for (i=j=0; i<str2.size() && j<str1.size(); ++j)
        
    {
            
    if(str1[j]==str2[i])
                
    ++i ;
            
    else if(i)
                i
    =fail[i-1]+1--j ;
        }

        
    return i==str2.size() ? j-i :-1 ;
    }


    int _tmain(int argc, _TCHAR* argv[])
    {
        
    char * str1="abababababcabababa" ;
        
    char * str2="ababababcab" ;
        
    int i=kmp_match(strlen(str1),str1,strlen(str2),str2) ;
        cout
    <<i<<endl ;
        i
    =kmp(str1,str2) ;
        cout
    <<i<<endl ;
        getchar() ;
        
    return 0;
    }

  • 相关阅读:
    C#按模板生成word文档总结
    Aspose.Words.dll根据模板生成word
    WCF服务
    Fiddler抓包工具
    文本过长显示...
    java JDK 环境变量配置
    js return关键字
    js限制文本框输入内容
    jQuery学习一
    JSON 教程
  • 原文地址:https://www.cnblogs.com/sunkang/p/2038832.html
Copyright © 2011-2022 走看看