zoukankan      html  css  js  c++  java
  • 串的模式匹配问题

    有三种方法

    1、直接匹配               2、首尾匹配                        3、KMP算法

    (1) 前两种算法时间复杂度为O(M*N);后一种为O(m+n)

    (2)算法1实际执行时间近似O(m+n),KMP算法只有模式串与主串之间有很多部分匹配的情况下才显得高效。

       但是KMP算法的优点在于主串指针不回溯,对处理从外设输入的庞大数据文件很有效,可以边读入边匹配,无需回头重读。

    1、直接匹配法  

    int index(SString S, SString T, int pos)
    {
        i=pos; j=1;
        while(i<=S[0]||j<=T[0])
        {
            if(S[i]==T[j])    {i++;    j++;}
            else 
                {i=i-j+2;  j=1;}
        }
        if(j>T[0])    return i-j+1;
        else
            return 0;
    }
    //注:此处T[0]意为字符串T的长度,实际数据从T[1]开始
    

    2、首尾匹配

    int index(SString S, SString T, int pos)
    {
        sLength=S[0];    tLength=T[0];   
        i=pos; 
        while(i<=sLength-tLength+1)
        {
            if(S[i]!=S[1])    ++i;
            else if(S[i+tLength-1]!=T[tLength])    ++i; 
            else
            {
                 k=1;j=2;    
                 while(j<tLength&&S[k+i]==T[j])
                 {++k;++j}
                 if(j==tLength)    return i;
                 else ++i;
            }
        }
        return 0;
    }
    //注:此处T[0]意为字符串T的长度,实际数据从T[1]开始
    

     3、KMP算法

    int index(SString S, SString T, int pos)
    {
        i=pos; j=1;
        while(i<=S[0]||j<=T[0])
        {
            if(S[i]==T[j])    {i++;    j++;}
            else 
               j = next[j];    
        }
        if(j>T[0])    return i-j+1;
        else
            return 0;
    }
    
    void get_next(SString T, int next[])  
    {
        i=1; next[1]=0; j=0;
        while(i<T[0])
        {
            if(j==0||T[i]==T[j])    
           {
                  ++i;    ++j;  
                  if(T[i]==T[j])  next[i]=next[j];
                  else next[i] = j;
          }
           else
                  j=next[j];
       }
    }
    //注:此处T[0]意为字符串T的长度,实际数据从T[1]开始
    
  • 相关阅读:
    2020牛客暑期多校(三)
    贪心算法
    高级搜索题集
    状态压缩dp
    [kuangbin带你飞]专题二 搜索进阶
    [kuangbin带你飞]专题一 简单搜索
    HDU 1695 GCD(求两区间的互质数对+容斥原理)
    UVA 10200 Prime Time(简单素数判定预处理)
    HDU 1452 FZU 1053 Happy 2004(逆元函数+因子和函数+大指数取模化简公式)
    低三位的数是8的倍数就可以被8整除
  • 原文地址:https://www.cnblogs.com/CanWork/p/2791417.html
Copyright © 2011-2022 走看看