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]开始
    
  • 相关阅读:
    Linux Core Dump
    ODP.NET Managed正式推出
    获取EditText的光标位置
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1603 斯诺登的密码
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1036 选数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1012 拼数
    (Java实现) 洛谷 P1028 数的计算
  • 原文地址:https://www.cnblogs.com/CanWork/p/2791417.html
Copyright © 2011-2022 走看看