字符串模式匹配

参考:https://www.cnblogs.com/lufangtao/p/3245647.html

1.简单模式匹配

 从主串的第pos位置字符开始和模式子串字符比较,如果相等,则继续逐个比较后续字符;否则从主串的下一个字符起再重新和模式子串的字符比较。直到找到匹配字符串或者是主串结尾。其中主串需要回溯到失配的位置的下一个位置,子串回溯到最开始位置

例如,主串T为:ababcabababab,子串为ababa,上述过程如下图所示。

 

参考代码

  /*
检测从主串T的pos位置开始,是否有和子串S匹配,如果有返回匹配开始位置,如果没有,返回-1
T:主串
 S:子串
tlength:主串长度
slength:子串长度
pos:主串开始位置
*/
 int Index (char T[],char S[],int tlength,int slength,int pos)
{
    int j=0,i=pos;
     while(i<tlength&&j<slength)
     {
        if(T[i]==S[j])
         {
             i++;
             j++;
         }
         else
         {
             i=i-j+1;
             j=0;
         }
     }
     return j==slength?i-slength:-1;
 
 }
 

2.KMP算法

 与简单算法的区别,KMP的特点是主串不用回溯,只需回溯子串即可, 即只需给子串找到一个“合适的位置”接着进行匹配,而不用挪动主串。我们的任务就是确定这个“合适的位置",从而引出了next数组。我们用next[j]表示当模式子串中第j个字符与主串中相应的字符失配时,在模式串中需要重新和主串比较的字符位置。需要说明的是,求next数组时只与模式字串自身的结构有关系,与主串无关。

另next数组求法:https://blog.csdn.net/wenyun_kang/article/details/65436838

参考代码:

int KMP_Index(char T[],char S[],int tlength,int slength,int pos)
{
    int *next=(int*)malloc(slength*sizeof(int));
    KMP_Next(S,next,slength);

    int j=-1,i=pos-1;
    while(i<tlength&&j<slength)
    {
        if(j==-1||T[i]==S[j])
        {
            i++;
            j++;
        }
        else
            j=next[j];
    }
    return j==slength?i-slength:-1;


}

 

posted on 2019-04-20 23:08  wnotes  阅读(1950)  评论(0编辑  收藏  举报