串的模式匹配问题

有三种方法

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

 

 

 

 

你可能感兴趣的:(模式)