左神第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代码相关推荐

  1. c# typescript_在任何IDE中从C#,Java或Python代码获取TypeScript接口的简单方法

    c# typescript by Leonardo Carreiro 莱昂纳多·卡雷罗(Leonardo Carreiro) 在任何IDE中从C#,Java或Python代码获取TypeScript接 ...

  2. java培训教程分享:Java编写软件代码自动提示功能

    本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...

  3. java 用程序代码解释继承_关于初级java程序员笔试题

    关于初级java程序员笔试题 Sun 认证Java程序员考试内容涉及Java所有相关知识.编程概念及applet开发技巧.下面是小编整理的关于初级java程序员笔试题,欢迎大家参考! 第一题:判断题 ...

  4. 使用JNA,让java调用原生代码

    JNA定义: JNA:java Native Access,是SUN公司开发的基于JNI的框架.JNI使得Java可以调用原生的c或者c++代码. JNA与JNI(Java Native Interf ...

  5. Java中普通代码块,构造代码块,静态代码块区别

    Java中普通代码块,构造代码块,静态代码块区别及代码 示例 //执行顺序:(优先级从高到低.)静态代码块>mian方法 >构造代码块>构造方法. 其中静态代码块只执行一次.构造代码 ...

  6. 【Groovy】Groovy 代码创建 ( 使用 Java 语法实现 Groovy 类和主函数并运行 | 按照 Groovy 语法改造上述 Java 语法规则代码 )

    文章目录 一.创建 Groovy 代码文件 二.使用 Java 语法实现 Groovy 类和主函数并运行 三.按照 Groovy 语法改造上述 Java 语法规则代码 一.创建 Groovy 代码文件 ...

  7. java数据结构实验一顺序表,java数据结构实验代码之升序顺序表

    java数据结构实验代码之升序顺序表 数据结构实验报告 学院:管理学院 班级:13电子商务(1)班 姓名:廖秋君 学号:3213004779 2014年 10月 23 日 目录 一.需求分析----- ...

  8. 经典十大排序算法(含升序降序,基数排序含负数排序)【Java版完整代码】【建议收藏系列】

    经典十大排序算法[Java版完整代码] 写在前面的话 十大排序算法对比 冒泡排序 快速排序 直接选择排序 堆排序 归并排序 插入排序 希尔排序 计数排序 桶排序 基数排序 完整测试类 写在前面的话   ...

  9. Eclipse输入Java和XML代码自动提示功能最简单的方法

    Eclipse输入Java和XML代码自动提示功能 1.设置 java 文件的代码提示功能 打 开 Eclipse 依次选择 Window > Preferences > Java > ...

最新文章

  1. C++访问属性和继承属性浅析
  2. 职业选择测试发型软件,发型师必看的10条职业经验
  3. Android 使用SWIG生成Jni代码
  4. 剑桥大学的下午茶,为何能喝出六十位诺贝尔奖获得者?
  5. .toString(c) 将数字值 渲染成 货币形式
  6. 【转】RabbitMQ六种队列模式-4.路由模式
  7. OSGI(面向Java的动态模型系统)和它的实现Equinox
  8. BZOJ2440 [中山市选2011]完全平方数
  9. python 获取cpu使用率_如何在python中获取过去10分钟的cpu使用率
  10. Lodop打印控件介绍
  11. Logback最佳实践和使用指导
  12. Jquery仿IGoogle实现可拖动窗口(源码)
  13. macos 废纸篓强制删除文件文件夹
  14. 在线pdf转换成word文档的方法
  15. 永洪科技CEO何春涛:PASO模型构建企业大数据能力
  16. SwiftUI CoreSpotlight 实战之实现Spotlight搜索(教程含源码)
  17. 【BUG】.NET项目|未能加载文件或程序集“xxx”,或它的某一个依赖项。系统找不到指定的文件的通解
  18. 用妙记多 Mojidoc 实践康奈尔笔记法
  19. 【迷失岛游戏框架开发个人每集总结(第三期)】
  20. 出现连接路由器的电脑不能上网,而手机可以上网的问题的一种解决方法

热门文章

  1. phpwechat的使用
  2. roszhong指定rviz的点启动_Rviz 实现 pannel 插件
  3. linux怎样删除分区合并,linux u盘分区合并分区工具重复歌曲怎样删除
  4. 北航操作系统课程-20200302课堂小测-操作系统引论
  5. AI开发基本流程介绍
  6. linux打开mdb文件怎么打开软件,mdb文件扩展名,mdb文件怎么打开?
  7. Java毕设项目鑫通物流车辆调度系统mp4(java+VUE+Mybatis+Maven+Mysql)
  8. win7字体放大不放大窗口_放大不确定的未来
  9. Win8 Metro(C#)数字图像处理--4图像颜色空间描述
  10. 0基础学RS(一)Packet Tracer 思科模拟器的使用以及下载