zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    数据库表设计
    solr的schame.xml
    搭建solr服务器
    lucene&solr索引维护之查询
    lucene&solr索引维护之删除和修改
    lucene&solr查询索引实例
    lucene&solr入门实例
    java集合排序整理
    HahMap(jdk=1.8)源码解读
    APIO2020 游记
  • 原文地址:https://www.cnblogs.com/myyan/p/3880364.html
Copyright © 2011-2022 走看看