• 字符串模式匹配


    参考: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;
    
    
    }

  • 相关阅读:
    Python基础Day2
    HDU
    HDU
    BZOJ
    Gym
    UVA
    UVA
    UVA
    UVA
    BZOJ
  • 原文地址:https://www.cnblogs.com/carrothhh/p/10743220.html
Copyright © 2020-2023  润新知