一、比较暴力算法和KMP算法

1、暴力算法:

双指针遍历主串和子串,当发现主串和子串不匹配时,双指针同时回溯

2、KMP算法:

双指针遍历主串和子串,当发现主串和子串不匹配时,通过比较子串的next数组只回溯子串指针,从而提高算法速度

二、next数组含义

next[j]=第j位字符前面的j-1位字符所组成的子串的最长公共前后缀长度

三、计算next数组

计算子串每个字符左子串的最长公共前后缀长度

四、算法实现

public class KMP {public static void main(String[] args) {String str="abcksljafkdshfjksd";String subs="sl";System.out.println(kmp(str,subs));}/*** 遍历比较字符串* @param str 主串* @param subs 子串* @return 子串在主串出现的第一个位置下标*/public static  int  kmp(String str,String subs){char[] subc=subs.toCharArray();                 //将子串转换成字符数组方便计算next数组int[] next=new int[subc.length];                //声明next数组getNext(subc,next);                             //计算next数组int i=0,j=0;                                    //双指针遍历主串和子串while(i<str.length()&&j<subs.length()){if(j==-1||str.charAt(i)==subs.charAt(j)){i++;j++;}else{j=next[j];                              //子串回溯}if(j==subs.length()){return i-j;                             //返回index下标}}return -1;}/*** 计算改变next数组(计算最长公共前后缀的值)* @param subc 子串* @param next next数组*/public static void getNext(char[] subc,int[] next){next[0]=-1;                                 //设置数组第一位为-1if(subc[1]==subc[0]){                      //判断子串第二位与第一位是否相等next[1]=1;                              //相等赋值为1,表明此时最长公共前缀为1}else{next[1]=0;                              //反之赋值为0}int i=2;                                    //从子串下标为2的位置开始计算int j=-1;                                   //此时j为next[0]的值while(i<subc.length){                       //遍历子串if(j==-1||subc[i-1]==subc[j]){          //判断上一个最长公共前后缀后的字符是否相等next[i++]=++j;                      //最长公共前后缀长度加一}else{j=next[j];                          //往前递归找上一个最长公共前后缀}}}}

KPM算法思想及实现相关推荐

  1. KPM算法详解(Next数组)

    由LeetCode_28引发的思考 最开始用了剪枝思想的朴素解法虽然做出来了,在看答案的时候发现了有一种叫KMP的算法专门就是解决快速查找匹配串问题的,进行了深入的学习. 下面的图源自@宫水三叶的解答 ...

  2. matlab温度数据怎么滤波_卡尔曼滤波算法思想理解 Kalman filter 第一篇

    卡尔曼滤波算法思想理解 Kalman filter 第一篇 最近在初步的理解目标跟踪的领域, 其中一个非常经典的算法卡尔曼滤波Kalman filter是需要有很好的理解才行, 由于已经脱离了学校,懂 ...

  3. JAVA工程师常用算法_算法工程师必须要知道的8种常用算法思想

    算法思想有很多,业界公认的常用算法思想有8种,分别是枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟.当然8种只是一个大概的划分,是一个"仁者见仁.智者见智"的问题. 1.1 ...

  4. Algorithms_算法思想_递归分治

    文章目录 引导案例 递归的定义 什么样的问题可以用递归算法来解决 递归如何实现以及包含的算法思 递归的公式 斐波那契数列代码实现 递归的时间复杂度和空间复杂度 递 与 归 递归的优化 优化方式一:不使 ...

  5. 【Tree】Prim算法思想与步骤

    Prim 算法思想: 从任意一顶点 v0 开始选择其最近顶点 v1 构成树 T1,再连接与 T1 最近顶点 v2 构成树 T2, 如此重复直到所有顶点均在所构成树中为止. Prim 算法步骤: T0 ...

  6. 快速排序 C++代码实现及其算法思想及时间复杂度分析及优化 恋上数据结构笔记

    文章目录 复习梗概 算法思想 算法复杂度分析及稳定性 如何优化? 快速排序改进版代码C++ 快速排序个人青春版代码 完整代码 复习梗概 算法思想,别的排序名字直接就能让人联想到它的算法思想,唯独快速排 ...

  7. Hough Transform 的算法思想

    1.Hough Transform 的算法思想 在直角坐标系和极坐标系中,点.线是对偶关系. 即直角坐标系中的点是极坐标系中的线,直角坐标系中的线是极坐标系中的点.反之也成立. 如下图所示,想要检测图 ...

  8. 深度增强学习前沿算法思想

    作者: Flood Sung,CSDN博主,人工智能方向研究生,专注于深度学习,增强学习与机器人的研究.  责编:何永灿,欢迎人工智能领域技术投稿.约稿.给文章纠错,请发送邮件至heyc@csdn.n ...

  9. 3.Python算法之贪心算法思想

    贪心算法 1.什么是贪心算法 2.贪心算法的特点和思路 3.贪心算法的缺点 4.贪心算法的基本思路 5.贪心算法的基本过程 6.贪心算法解决"找零"问题 6.贪心算法解决" ...

最新文章

  1. mxnet 和pytorch比较
  2. ubuntu16.04下更新UHD3.14+GNURadio3.7.13.5
  3. AA065VD数据线连接错位的现象及分析总结
  4. Fabric--区块链应用开发
  5. 每日一题之 MySQL
  6. 三相滤波器怎么接线_单相电机和三相电机怎么接线?为什么三相电机有3或6个接线柱?...
  7. LeetCode 1855. 下标对中的最大距离(双指针)
  8. idea创建多模块Springboot项目、导入多模块、删除多模块
  9. 论文|Airbnb Embedding的实践和思考
  10. 直接让web服务运行在80端不行吗,为什么要用nginx反向代理?
  11. 用自己的数据集训练Mask-RCNN实现过程中的坑
  12. Android 里的adb命令
  13. PS批量修改文件大小及类型
  14. win10服务器怎么连接显示器不亮,Win10检测不到第二个显示器怎么解决?Win10外接显示器黑屏解决方法...
  15. 原来网易的lofter界面是模仿的是tumblr
  16. 计算机与英语关系,计算机底层和英文毫无关系
  17. 商人渡模型matlab及模型假设,商人过河问题
  18. outStream.flush()
  19. ACCESS数据库的压缩,备份,还原,下载,删除的实现
  20. 单片机汇编延时程序的理解

热门文章

  1. 【Ocr】ocr表格检测;返回结果说明;可定制表格模板识别处理
  2. 机器学习中数据预处理——标准化/归一化方法(scaler)
  3. python ros gps转xyz坐标系
  4. JPA 概述及 SpringDataJpa 框架基本使用指南
  5. conda安装第三方库
  6. 计算机数值分析-插值法-差商-04
  7. Git从库中移除已删除大文件
  8. 计算机前置usb无法使用,电脑前置usb3.0接口没反应怎么办
  9. 免费观看coursera上的课程
  10. java二进制计算_Java 二进制,八进制,十进制,十六进制转换运算