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

  • 相关阅读:
    真的是最后一次作业了!!!!
    最后一次总结
    作业十一总结?
    作业十一总结
    实验十总结
    作业9总结
    附加作业
    补交第十次作业
    补交第九次作业
    补交第八次作业
  • 原文地址:https://www.cnblogs.com/sunkang/p/2038832.html
Copyright © 2020-2023  润新知