https://leetcode.com/problems/implement-strstr/  28. Implement strStr()

暴力算法:

int ViolentMatch(char* s, char* p)
{
int sLen = strlen(s);
int pLen = strlen(p); int i = ;
int j = ;
while (i < sLen && j < pLen)
{
if (s[i] == p[j])
{
//①如果当前字符匹配成功(即S[i] == P[j]),则i++,j++
i++;
j++;
}
else
{
//②如果失配(即S[i]! = P[j]),令i = i - (j - 1),j = 0
i = i - j + ;
j = ;
}
}
//匹配成功,返回模式串p在文本串s中的位置,否则返回-1
if (j == pLen)
return i - j;
else
return -;
}

KMP(Knuth-Morris-Pratt)算法:

当T[i] != P[j]时

有T[i-j ~ i-1] == P[0 ~ j-1]

由P[0 ~ k-1] == P[j-k ~ j-1]

必然:T[i-k ~ i-1] == P[0 ~ k-1] -->because k<j

 如果给定的模式串是:“ABCDABD”,从左至右遍历整个模式串,其各个子串的前缀后缀分别如下表格所示:
    也就是说,原模式串子串对应的各个前缀后缀的公共元素的最大长度表为(下简称《最大长度表》):

 
KMP 算法:=NEXT数组下标从0开始更容易理解=
class Solution {
public: void GenNext(string p, int next[]){
int plen = p.size();
next[0] = 0;
int j = 0;
for(int i=1; i<plen; ){
if(p[j] == p[i]){
next[i] = j+1;
j++;
i++;
}
else{
if(j!=0)
j = next[j-1];
else{
next[i] = 0;
i++;
}
}
}
}
int strStr(string haystack, string needle) {
int slen = haystack.size();
int plen = needle.size();
if(slen < plen) return -1;
if(needle == "" ||haystack == "") return 0;
int i=0, j=0;
int next[plen];
GenNext(needle, next);
while(i<slen && j<plen){
if(haystack[i]==needle[j]){
i++;
j++;
}else{
if(j!=0)
j = next[j-1];
else
i++;
}
}
if(j==plen) return i-j;
return -1;
}
};

KMP算法参考:https://www.cnblogs.com/ZuoAndFutureGirl/p/9028287.html

更高级搜索算法:

BM算法  Sunday算法https://www.cnblogs.com/ZuoAndFutureGirl/p/9028287.html

第3章:LeetCode--算法:strStr KMP算法的更多相关文章

  1. 数据结构之BF算法,kmp算法,三元组,十字链表总结

    在这一章中,老师教了我们四种数据结构:BF算法,kmp算法,三元组和十字链表:还给我们讲了2019年团体天体赛中T1-8的AI题 1.对于BF和kmp算法,老师除了在课堂上讲解算法的主要核心思想外,还 ...

  2. 算法:KMP算法

    算法:KMP排序 算法分析 KMP算法是一种快速的模式匹配算法.KMP是三位大师:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的,所以取首字母组成KMP. 少部分图片来自孤~影 ...

  3. BF算法与KMP算法

    BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的 ...

  4. 算法 | 串匹配算法之KMP算法及其优化

    主串 s:A B D A B C A B C 子串 t:  A B C A B 问题:在主串 s 中是否存在一段 t 的子串呢? 形如上述问题,就是串匹配类问题.[串匹配--百度百科] 串匹配问题是一 ...

  5. KMP算法及KMP算法的应用(POJ2406)

    ///KMP算法#include<bits/stdc++.h> using namespace std; ]; void makeNext(const char P[],int next[ ...

  6. 什么是KMP算法?KMP算法推导

    花了大概3天时间,了解,理解,推理KMP算法,这里做一次总结!希望能给看到的人带来帮助!! 1.什么是KMP算法? 在主串Str中查找模式串Pattern的方法中,有一种方式叫KMP算法 KMP算法是 ...

  7. 串、串的模式匹配算法(子串查找)BF算法、KMP算法

    串的定长顺序存储#define MAXSTRLEN 255,//超出这个长度则超出部分被舍去,称为截断 串的模式匹配: 串的定义:0个或多个字符组成的有限序列S = 'a1a2a3…….an ' n ...

  8. 算法笔记--KMP算法 && EXKMP算法

    1.KMP算法 这个博客写的不错:http://www.cnblogs.com/SYCstudio/p/7194315.html 模板: next数组的求解,那个循环本质就是如果相同前后缀不能加上该位 ...

  9. 数据结构4_java---顺序串,字符串匹配算法(BF算法,KMP算法)

    1.顺序串 实现的操作有: 构造串 判断空串 返回串的长度 返回位序号为i的字符 将串的长度扩充为newCapacity 返回从begin到end-1的子串 在第i个字符之前插入字串str 删除子串 ...

随机推荐

  1. node.js 文件下载

    //下载参数 var http = require("http"); var fs = require("fs"); var path = require(&q ...

  2. php过滤表情符号

    <?php $clean_text = ""; // Match Emoticons $regexEmoticons = '/[\x{1F600}-\x{1F64F}]/u' ...

  3. presto计算日期间隔天数或者小时间隔——date_diff函数使用

    “Presto是Facebook最新研发的数据查询引擎,可对250PB以上的数据进行快速地交互式分析.据称该引擎的性能是 Hive 的 10 倍以上.”,亲身用过之后,觉得比hive快了10倍不止. ...

  4. mongo 导入import 导出 exprot操作

    .mongo export导出 /mongoexport /h [ip地址] /port [端口] /u [用户名] /p [密码] /d [数据库] -c [表名] /q [查询语句]  /o [保 ...

  5. CentOS 7下安装Redis

    1.安装gcc环境 sudo yum install gcc-c++ 2.安装wget sudo yum install wget 3.下载Redis源码包 wget http://download. ...

  6. 创建Bitmap之Bitmap静态方法使用示例

    package com.loaderman.customviewdemo; import android.app.Activity; import android.content.Intent; im ...

  7. js实现文本框支持加减运算的方法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/T ...

  8. 002-创建型-02-抽象工厂模式(Abstract Factory)

    一.概述 抽象工厂模式提供同一个创建一系列相关或相互依赖对象的接口,无须指定它们具体的类 抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一 ...

  9. 123457123457#0#-----com.yuming.TruckCarRun01--前拼后广--大卡车游戏cym

    com.yuming.TruckCarRun01--前拼后广--大卡车游戏cym

  10. CentOS 端口和防火墙操作

    Centos 7 端口和防火墙命令: 查看已经开放的端口:firewall-cmd --list-ports 开启端口:firewall-cmd --zone=public --add-port=80 ...