Java实现KMP代码
左神第12节课:
基础提升:有序表、并查集
BM算法:
实际的软件开发中,大部分情况下,模式串和主串的长度都不会太长。而且每次模式串与主串中的子串匹配的时候,当中途遇到不能匹配的字符的时候,就可以就停止了,不需要把 m 个字符都比对一下。所以,尽管理论上的最坏情况时间复杂度是 O(n*m),但是,统计意义上,大部分情况下,算法执行效率要比这个高很多。
https://zh.wikipedia.org/wiki/KISS%E5%8E%9F%E5%88%99
KMP算法是由一个问题而引发的:
对于一个字符串str(长度为N)和另一个字符串match(长度为M),如果match是str的子串,请返回其在str第一次出现时的首字母下标,若match不是str的子串则返回-1。
public class KMP {public static void main(String[] args) {System.out.println(getIndexOf("abcacb", "cb"));}public static int getIndexOf(String str, String m) {if (str == null || m == null || m.length() < 1 || str.length() < m.length())return -1;char[] chs1 = str.toCharArray();char[] chs2 = m.toCharArray();if (chs1.length < chs2.length) return -1;int[] next = getNextArr(chs2);int i1 = 0, i2 = 0;while (i1 < str.length() && i2 < m.length()) {//正常匹配的就一个一个向着后面走if (chs1[i1] == chs2[i2]) {i1++;i2++;//如果当前的指针指向最后一个的时候,说明i1当前位置与i2所有可能的快速方法都不匹配} else if (next[i2] == -1) {i1++;//当前不ok,那么尝试去看看下一个next数组总的结点但是否可行} else {i2 = next[i2];}System.out.println(1);}return i2 == m.length() ? i1 - i2 : -1;}public static int[] getNextArr(char[] ms) {if (ms.length == 1) return new int[]{-1};int[] next = new int[ms.length];next[0] = -1;next[1] = 0;int i = 2;int cn = 0;// 保证i没有越界while (i < ms.length) {// i位置的都基于前面的数据if (ms[i - 1] == ms[cn]) {next[i++] = ++cn;
// 只有cn > 0的时候才能够继续向着前面不停遍历} else if (cn > 0) {cn = next[cn];
// 遍历到cn也等于0了,没办法了,就直接将这个点的数据设置为0} else {next[i++] = 0;}}return next;}
}
Java实现KMP代码相关推荐
- c# typescript_在任何IDE中从C#,Java或Python代码获取TypeScript接口的简单方法
c# typescript by Leonardo Carreiro 莱昂纳多·卡雷罗(Leonardo Carreiro) 在任何IDE中从C#,Java或Python代码获取TypeScript接 ...
- java培训教程分享:Java编写软件代码自动提示功能
本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...
- java 用程序代码解释继承_关于初级java程序员笔试题
关于初级java程序员笔试题 Sun 认证Java程序员考试内容涉及Java所有相关知识.编程概念及applet开发技巧.下面是小编整理的关于初级java程序员笔试题,欢迎大家参考! 第一题:判断题 ...
- 使用JNA,让java调用原生代码
JNA定义: JNA:java Native Access,是SUN公司开发的基于JNI的框架.JNI使得Java可以调用原生的c或者c++代码. JNA与JNI(Java Native Interf ...
- Java中普通代码块,构造代码块,静态代码块区别
Java中普通代码块,构造代码块,静态代码块区别及代码 示例 //执行顺序:(优先级从高到低.)静态代码块>mian方法 >构造代码块>构造方法. 其中静态代码块只执行一次.构造代码 ...
- 【Groovy】Groovy 代码创建 ( 使用 Java 语法实现 Groovy 类和主函数并运行 | 按照 Groovy 语法改造上述 Java 语法规则代码 )
文章目录 一.创建 Groovy 代码文件 二.使用 Java 语法实现 Groovy 类和主函数并运行 三.按照 Groovy 语法改造上述 Java 语法规则代码 一.创建 Groovy 代码文件 ...
- java数据结构实验一顺序表,java数据结构实验代码之升序顺序表
java数据结构实验代码之升序顺序表 数据结构实验报告 学院:管理学院 班级:13电子商务(1)班 姓名:廖秋君 学号:3213004779 2014年 10月 23 日 目录 一.需求分析----- ...
- 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】
经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话 ...
- Eclipse输入Java和XML代码自动提示功能最简单的方法
Eclipse输入Java和XML代码自动提示功能 1.设置 java 文件的代码提示功能 打 开 Eclipse 依次选择 Window > Preferences > Java > ...
最新文章
- C++访问属性和继承属性浅析
- 职业选择测试发型软件,发型师必看的10条职业经验
- Android 使用SWIG生成Jni代码
- 剑桥大学的下午茶,为何能喝出六十位诺贝尔奖获得者?
- .toString(c) 将数字值 渲染成 货币形式
- 【转】RabbitMQ六种队列模式-4.路由模式
- OSGI(面向Java的动态模型系统)和它的实现Equinox
- BZOJ2440 [中山市选2011]完全平方数
- python 获取cpu使用率_如何在python中获取过去10分钟的cpu使用率
- Lodop打印控件介绍
- Logback最佳实践和使用指导
- Jquery仿IGoogle实现可拖动窗口(源码)
- macos 废纸篓强制删除文件文件夹
- 在线pdf转换成word文档的方法
- 永洪科技CEO何春涛:PASO模型构建企业大数据能力
- SwiftUI CoreSpotlight 实战之实现Spotlight搜索(教程含源码)
- 【BUG】.NET项目|未能加载文件或程序集“xxx”,或它的某一个依赖项。系统找不到指定的文件的通解
- 用妙记多 Mojidoc 实践康奈尔笔记法
- 【迷失岛游戏框架开发个人每集总结(第三期)】
- 出现连接路由器的电脑不能上网,而手机可以上网的问题的一种解决方法
热门文章
- phpwechat的使用
- roszhong指定rviz的点启动_Rviz 实现 pannel 插件
- linux怎样删除分区合并,linux u盘分区合并分区工具重复歌曲怎样删除
- 北航操作系统课程-20200302课堂小测-操作系统引论
- AI开发基本流程介绍
- linux打开mdb文件怎么打开软件,mdb文件扩展名,mdb文件怎么打开?
- Java毕设项目鑫通物流车辆调度系统mp4(java+VUE+Mybatis+Maven+Mysql)
- win7字体放大不放大窗口_放大不确定的未来
- Win8 Metro(C#)数字图像处理--4图像颜色空间描述
- 0基础学RS(一)Packet Tracer 思科模拟器的使用以及下载