串的模式匹配问题

有三种方法

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]开始

 

 

 

 

posted @ 2012-11-27 20:30  programmertata  阅读(305)  评论(0编辑  收藏  举报