** 朴素模式匹配算法、kmp模式匹配算法、kmp模式匹配算法改进。java代码**

思路过段时间整理~ 可以先看看阮一峰的这篇博客,字符串匹配的KMP算法

package edu.hubu.base;

/**

* Created by 张狄

* 2018-07-19 15:31

*/

public class KMPbook {

public static void main(String[] args) {

String str = "abcsdfasdfafahhtshhjjagkababaaabagak;shdgl;ahgnakhnjkljdkjkjdef";

String str1 = "ababaaaba";

int[] test = next(str1);

for (int i:test

) {

System.out.printf(i+",");

}

System.out.println("\n");

//优化后

int[] testval = nextval(str1);

for (int i:testval

) {

System.out.printf(i+",");

}

System.out.println("\n");

//朴素

int test1 = findIndex(str, str1, 1);

//kmp

int test2 = index_KMP(str, str1, 1);

//kmp

int test3 = index_KMPval(str, str1, 1);

System.out.println(test2+":"+test1+":"+test3);

}

/**

* 朴素模式匹配算法

* @param s

* @param t

* @param pos

* @return

*/

public static int findIndex(String s,String t,int pos) {

char[] cs = s.toCharArray();

char[] ct = t.toCharArray();

int i = pos, j = 1;

if (pos <= 0) {

return -1;

}

while (j <= ct.length&&i <= cs.length ) {

if (cs[i - 1] == ct[j - 1]) {

++i;

++j;

} else {

i = i - j + 2;

j = 1;

}

}

if (j > ct.length) {

return i - ct.length;

} else {

return -1;

}

}

/**

* 获取下一步长位置

* @param module

* @return

*/

private static int[] next(String module) {

int[] _next = new int[module.length()];

int i = 1, j = 0;

_next[0] = 0;

while (i < module.length()) {

if (j == 0 || module.charAt(i-1) == module.charAt(j-1)) {

++i;

++j;

_next[i-1] = j;

} else {

j = _next[j-1];//字符不相同j值回溯

}

}

return _next;

}

/**

* 常规kmp模式匹配算法

* @param s

* @param t

* @param pos

* @return

*/

private static int index_KMP(String s, String t, int pos) {

char[] cs = s.toCharArray();

char[] ct = t.toCharArray();

int i = pos, j = 1;

int[] _next = next(t);

if (pos <= 0) {

return -1;

}

while (j <= ct.length&&i <= cs.length ) {

if (j==0||cs[i - 1] == ct[j - 1]) {//两字母相等则继续,相对朴素算法增加了j=0判断。

++i;

++j;

} else {//指针后退重新开始匹配

j = _next[j-1];//j退回合适的位置,i值不变。

}

}

if (j > ct.length) {

return i - ct.length;

} else {

return -1;

}

}

/**

* 优化后获取下一步长位置

* @param module

* @return

*/

private static int[] nextval(String module) {

int[] _next = new int[module.length()];

int i = 1, j = 0;

_next[0] = 0;

while (i < module.length()) {

if (j == 0 || module.charAt(i-1) == module.charAt(j-1)) {

++i;

++j;

if (module.charAt(i - 1) != module.charAt(j - 1)) {

_next[i - 1] = j;

} else {

_next[i - 1] = _next[j - 1];

}

} else {

j = _next[j-1];//字符不相同j值回溯

}

}

return _next;

}

/**

* 优化后kmp模式匹配算法

* @param s

* @param t

* @param pos

* @return

*/

private static int index_KMPval(String s, String t, int pos) {

char[] cs = s.toCharArray();

char[] ct = t.toCharArray();

int i = pos, j = 1;

int[] _nextval = nextval(t);

if (pos <= 0) {

return -1;

}

while (j <= ct.length&&i <= cs.length ) {

if (j==0||cs[i - 1] == ct[j - 1]) {

++i;

++j;

} else {

j = _nextval[j-1];

}

}

if (j > ct.length) {

return i - ct.length;

} else {

return -1;

}

}

}

java中KMP模式_朴素模式匹配算法、kmp模式匹配算法、kmp模式匹配算法改进。java代码...相关推荐

  1. java 定义变量时 赋值与不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...

    探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值 当基本数据类型作为普通变量(八大基本类型: byte,char,boolean,short,int,long,fl ...

  2. java中gettext方法_深入理解Java中方法的参数传递机制

    形参和实参 我们知道,在Java中定义方法时,是可以定义参数的,比如: public static void main(String[] args){ } 这里的args就是一个字符串数组类型的参数. ...

  3. java 基本类型 不赋值_探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值...

    探究Java中基本类型和部分包装类在声明变量时不赋值的情况下java给他们的默认赋值 当基本数据类型作为普通变量(八大基本类型: byte,char,boolean,short,int,long,fl ...

  4. java 生产者消费者模式_聊聊并发(十)生产者消费者模式

    本文首发于InfoQ   作者:方腾飞  校对:张龙 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使 ...

  5. 我的世界java旁观者模式_我的世界如何切换到旁观模式

    我的世界中如何切换到旁观模式 本篇教程将用图文的形式一步步教会你在我的世界中如何切换到旁观模式. 旁观模式只出现在我的世界PC/Mac版本中,它首次出现在我的世界PC/Mac  1.8版本中,允许玩家 ...

  6. java中override快捷键_【基础回溯1】面试又被 Java 基础难住了?推荐你看看这篇文章。...

    本文已经收录自 https://github.com/Snailclimb/JavaGuide  (59k+ Star):[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识. ...

  7. 有几种部署模式_来!PyFlink 作业的多种部署模式

    关于 PyFlink 的博客我们曾介绍过 PyFlink 的功能开发,比如,如何使用各种算子(Join/Window/AGG etc.),如何使用各种 Connector(Kafka, CSV, So ...

  8. java 中的枚举_说说Java中的枚举(一)

    在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的.例如星期一到星期日七个数据元素组成了一周的"数据 ...

  9. 在JAVA中 以下程序_在Java中,以下程序的输出结果是()_学小易找答案

    [单选题]运行以下Java代码,说法正确的是( ). [单选题]在Java中,以下程序的输出结果是() [单选题]利用"出声"的方式向学生展示教师分析问题的过程与方法的教学方法是_ ...

  10. Java中合法的关键词_优秀程序员必须掌握的java中50个关键字

    关键字和保留字的区别 正确识别java语言的关键字(keyword)和保留字(reserved word)是十分重要的.Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表 ...

最新文章

  1. 武器化道路越走越远的无人机
  2. python使用复合语句def创建函数对象_【收藏】Python实用技巧-成为Pythoner必经之路...
  3. Python应用matplotlib绘图简介
  4. golang用户认证
  5. 【FHQ treap】维护书架(金牌导航 无旋式treap-1)
  6. 小程序 | 使用 npm 模块配置 Vant Weapp 框架
  7. 高中计算机课程打字网址,信息课
  8. 08 内存分配和程序内存布局
  9. python实现logistic_用python实现Logistic
  10. centos6.5 tomcat开机启动
  11. WIN10远程计算机不支持所需的FIPS安全级别解决
  12. 由于dns服务为启动导致的GI集群启动故障
  13. android手机charles证书下载
  14. LeetCode.No5——最长回文子串
  15. 【新书速递】集成电路敏捷设计
  16. 陕西电大计算机上机考试题,XX年电大计算机上机操作题(带答案)
  17. 雷神笔记本关闭触摸板
  18. 手工测试2年面临职场危机,3个月进阶自动化测试后,老板终于留我了...
  19. 关于tp-link wr740 v4的刷机救砖的办法(非线刷解决)恢复原版的
  20. 什么是PCB中的net和vl孔

热门文章

  1. KMS激活服务器搭建
  2. 网络编程--Linux
  3. linux双网卡绑定配置lacp,Redhat和Centos操作系统双网卡绑定
  4. 什么是云服务? Azure 云服务
  5. 中国小夜灯行业市场供需与战略研究报告
  6. 低耦合, 高内聚的含义是什么
  7. java isBlank和isEmpty区别
  8. 发表教育教学论文的期刊《中国教师》杂志简介及投稿须知
  9. 计算机oj平台搭建应该学什么,青岛大学开源OJ平台搭建
  10. Python 传奇:30 年崛起之路