KPM算法思想及实现
一、比较暴力算法和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算法思想及实现相关推荐
- KPM算法详解(Next数组)
由LeetCode_28引发的思考 最开始用了剪枝思想的朴素解法虽然做出来了,在看答案的时候发现了有一种叫KMP的算法专门就是解决快速查找匹配串问题的,进行了深入的学习. 下面的图源自@宫水三叶的解答 ...
- matlab温度数据怎么滤波_卡尔曼滤波算法思想理解 Kalman filter 第一篇
卡尔曼滤波算法思想理解 Kalman filter 第一篇 最近在初步的理解目标跟踪的领域, 其中一个非常经典的算法卡尔曼滤波Kalman filter是需要有很好的理解才行, 由于已经脱离了学校,懂 ...
- JAVA工程师常用算法_算法工程师必须要知道的8种常用算法思想
算法思想有很多,业界公认的常用算法思想有8种,分别是枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟.当然8种只是一个大概的划分,是一个"仁者见仁.智者见智"的问题. 1.1 ...
- Algorithms_算法思想_递归分治
文章目录 引导案例 递归的定义 什么样的问题可以用递归算法来解决 递归如何实现以及包含的算法思 递归的公式 斐波那契数列代码实现 递归的时间复杂度和空间复杂度 递 与 归 递归的优化 优化方式一:不使 ...
- 【Tree】Prim算法思想与步骤
Prim 算法思想: 从任意一顶点 v0 开始选择其最近顶点 v1 构成树 T1,再连接与 T1 最近顶点 v2 构成树 T2, 如此重复直到所有顶点均在所构成树中为止. Prim 算法步骤: T0 ...
- 快速排序 C++代码实现及其算法思想及时间复杂度分析及优化 恋上数据结构笔记
文章目录 复习梗概 算法思想 算法复杂度分析及稳定性 如何优化? 快速排序改进版代码C++ 快速排序个人青春版代码 完整代码 复习梗概 算法思想,别的排序名字直接就能让人联想到它的算法思想,唯独快速排 ...
- Hough Transform 的算法思想
1.Hough Transform 的算法思想 在直角坐标系和极坐标系中,点.线是对偶关系. 即直角坐标系中的点是极坐标系中的线,直角坐标系中的线是极坐标系中的点.反之也成立. 如下图所示,想要检测图 ...
- 深度增强学习前沿算法思想
作者: Flood Sung,CSDN博主,人工智能方向研究生,专注于深度学习,增强学习与机器人的研究. 责编:何永灿,欢迎人工智能领域技术投稿.约稿.给文章纠错,请发送邮件至heyc@csdn.n ...
- 3.Python算法之贪心算法思想
贪心算法 1.什么是贪心算法 2.贪心算法的特点和思路 3.贪心算法的缺点 4.贪心算法的基本思路 5.贪心算法的基本过程 6.贪心算法解决"找零"问题 6.贪心算法解决" ...
最新文章
- mxnet 和pytorch比较
- ubuntu16.04下更新UHD3.14+GNURadio3.7.13.5
- AA065VD数据线连接错位的现象及分析总结
- Fabric--区块链应用开发
- 每日一题之 MySQL
- 三相滤波器怎么接线_单相电机和三相电机怎么接线?为什么三相电机有3或6个接线柱?...
- LeetCode 1855. 下标对中的最大距离(双指针)
- idea创建多模块Springboot项目、导入多模块、删除多模块
- 论文|Airbnb Embedding的实践和思考
- 直接让web服务运行在80端不行吗,为什么要用nginx反向代理?
- 用自己的数据集训练Mask-RCNN实现过程中的坑
- Android 里的adb命令
- PS批量修改文件大小及类型
- win10服务器怎么连接显示器不亮,Win10检测不到第二个显示器怎么解决?Win10外接显示器黑屏解决方法...
- 原来网易的lofter界面是模仿的是tumblr
- 计算机与英语关系,计算机底层和英文毫无关系
- 商人渡模型matlab及模型假设,商人过河问题
- outStream.flush()
- ACCESS数据库的压缩,备份,还原,下载,删除的实现
- 单片机汇编延时程序的理解