• leetcode Implement strStr()


    KMP算法:

    /** KMP算法中获取模式中每位的next值。next[i]=j表示pattern[0..i]中最长前后缀后面的那个元素的位置为j在进行匹配的过程中,匹配失败则取得上一个 next 函数的值*/

    void get_next(char *pattern, int *next)
    {
     int length=strlen(pattern);//模式的总长度
     next[0]=0;//第一个位置一定为0
     int j=0;//匹配的起始位置
     for(int i=1;i<length;i++)//获取next的其他位的值
     {
      //如果已经匹配上了某些字符,但是当前无法匹配,回溯寻找
      while(j>0&&pattern[i]!=pattern[j])
      {
       j=next[j-1];//在j位匹配失败,那么就从位置next[j-1]开始匹配
                   //next[j-1]表示pattern[0..j-1]中最长前后缀后面的那个元素
      }
      //如果能够匹配上,向下推进一个位置,表示在位j上匹配成功后,下一个需要考虑的位是j+1
      if(pattern[j]==pattern[i])
       j++;
      next[i]=j;
     }
    }

    char *strStr(char *haystack, char *needle) {
     if(haystack==NULL||needle==NULL)
      return NULL;
     if(needle[0]=='')
      return haystack;
     int length1=strlen(haystack);
     int length2=strlen(needle);
     int *next=new int[length2];
     get_next(needle,next);
     int j=0;
     for(int i=0;i<length1;i++)
     {
      //j位置跳到next[j-1],
      //next[j-1]中存储的是pattern[0..j-1]中最长前后缀后面的元素的位置
      while(j>0&&haystack[i]!=needle[j])
       j=next[j-1];
      //匹配成功,j往后移一位
      if(haystack[i]==needle[j])
       j++;
      //全部匹配,返回开始位置
      if(j==length2)
       return haystack+i-length2+1;
     }
     //没找到,返回NULL
     return NULL;
    }

  • 相关阅读:
    sql中not exists的用法
    jsp中target="_blank"的用法
    jsp 运用 session 登录输出
    jsp留言板
    编写JSP 实现用户登录并判断用户或密码
    jsp打印九九乘法表
    jsp输出当前时间
    jsp输出金字塔
    jsp输出5的阶乘
    jdbc练习3
  • 原文地址:https://www.cnblogs.com/myyan/p/3880364.html
Copyright © 2020-2023  润新知