当前位置: 首页 > news >正文

[LeetCode]—Implement strStr() 寻找子串匹配第一个位置 (KMP)

Implement strStr()

 

Implement strStr().

Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack.

分析:

         子串匹配问题。主要用该题巩固复习了一下KMP算法。

          先用BF方法,快速的完成一下:复杂度O(M*N)

         

class Solution {
public:
     char *strStr(char *haystack, char *needle) {
        int lh=strlen(haystack);
        int ln=strlen(needle);
        
         int i=0,j=0,start;
         if (ln==0)return haystack; 
         while((lh-i)>=ln){
            
          start=i;
          while(haystack[i++]==needle[j++]){
            if(j==ln)return &haystack[start];
          }
           i=start+1;
           j=0;
         }
         
         return NULL;
    }
};

再回去复习一下KMP算法:

        KMP算法的主要贡献在于:对目标串S的遍历可以一次到底,不用再进行回溯,只移动模式串T。

       主要依据:分析模式串T的自身特点,如果前缀和后缀有相等的部分,那么,在不等的情况下,只需要移动到前缀后一位和当前目标串S当前位比较。其中求数据Next[i] 是关键。Next[i] 数组表示对于模式串T,当前i位如果未匹配成功,就让Next[i](小于i的)位来匹配,相当于T移动。

       介绍KMP详细原理的文章有:http://blog.csdn.net/v_july_v/article/details/7041827

       求解Next[]数组方法清晰的文章有:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html

 

最后是我实现的KMP版本的求解:O(M+N)


class Solution {
public:
     char *strStr(char *haystack, char *needle) {
            if(strlen(needle)==0)return haystack; 
            int ind=KMP(haystack,needle);
            if(ind>0)return &haystack[ind-1];
            return NULL;
      } 

private:
    int KMP(const char *S,const char *T){ //返回的是位置,不是下标
        int len_S=strlen(S);
        int len_T=strlen(T);
        int i=0,j=0;
        
        int *next=(int *)malloc(sizeof(int)*len_T);
        Next(next,T);
        
        while(i<len_S && j<len_T ){
            if(j==-1 || S[i]==T[j])
                i++,j++;
            else
                j=next[j];
        }

        if(j>=len_T) 
                return (i-len_T+1);
        else
                return -1;

    }

    void Next(int *next,const char *T){
         int len_T=strlen(T);
          assert(len_T>0);   //len_T=0,退出
         
         next[0]=-1;
         int i=0,k=-1;
         while(i<len_T-1)
         {
            if(k==-1 || T[i]==T[k]){
                k++;
                i++;
                next[i]=k;
            }else
                k=next[k];
         } 
    }
    
};


求next数组是可以由优化的,有时间也还可以继续研究下 Boyer-Mooer算法和Rabin-Karp算法。


相关文章:

  • MFC图形函数(转载)
  • [LeetCode]—Add Binary 两个字符串二进制相加
  • 一个VC写的模拟时钟
  • [LeetCode]—Longest Palindromic Substring 最长回文子串
  • 串行通信技术SERDES
  • 从两种SQL表连接写法来了解过去
  • IT项目外包的4321法则
  • [LeeCode]—Wildcard Matching 通配符匹配问题
  • 快马探营:移动MM“热料”解密
  • [LeetCode]-Integer to Roman 阿拉伯数字转罗马数字
  • Ado.Net操作Excel文件数据常见问题及解决
  • [LeetCode]—Roman to Integer 罗马数字转阿拉伯数字
  • vim 全局批量替换
  • [LeetCode]—Anagrams 回文构词法
  • 一个简单的读写文件程序-适用于MTK平台资源管理
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 2017届校招提前批面试回顾
  • CentOS7简单部署NFS
  • cookie和session
  • Druid 在有赞的实践
  • Electron入门介绍
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • Iterator 和 for...of 循环
  • Java 多线程编程之:notify 和 wait 用法
  • JavaScript HTML DOM
  • javascript 哈希表
  • JavaScript 奇技淫巧
  • Java比较器对数组,集合排序
  • JAVA多线程机制解析-volatilesynchronized
  • npx命令介绍
  • PaddlePaddle-GitHub的正确打开姿势
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Wamp集成环境 添加PHP的新版本
  • 程序员最讨厌的9句话,你可有补充?
  • 大快搜索数据爬虫技术实例安装教学篇
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 2017年360最后一道编程题
  • mysql面试题分组并合并列
  • ​2020 年大前端技术趋势解读
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​插件化DPI在商用WIFI中的价值
  • #Linux(make工具和makefile文件以及makefile语法)
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (1)Android开发优化---------UI优化
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (八)Spring源码解析:Spring MVC
  • (编译到47%失败)to be deleted
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (转)我也是一只IT小小鸟
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • **PHP分步表单提交思路(分页表单提交)