1 原理 

参考 《大话数据结构》第5章 串 的第5.7小节 : KMP模式匹配算法

2 java代码

KMP.java

package leaning.string.KMP;public class KMP {public static int indexKMP(String source, String target,int pos) {/* i 用于主串source当前位置下标值,若pos不为1则从pos位置开始匹配 */int i = pos ; /* j 用于子串 target中当前位置下标值 */int j = 1 ;/*定义一组next数组*/int[] next = new int[IntArrayLength.length];  /*对target进行分析,得到next数组*/next = NextUtil.getNext(target);// 将source,target字符串变为字符数组char[] sourceChar = KMPStringUtil.stringToChar(source);char[] targetChar = KMPStringUtil.stringToChar(target);//若i小于source长度并且target小于target长度,执行循环while(i <=source.length() && j <= target.length() ){if(j==0 || sourceChar[i] == targetChar[j] ){++i;++j;}else{j = next[j] ;}}if( j > target.length() ){return i - target.length();}else{return 0;   }}public static void main(String args[]) {String source = "asdkfjslkfjwejdklfjew8odklfjsdlkfjslkdj";String target = "w8odkl";int pos = 0;int p  = KMP.indexKMP(source, target, pos);System.out.println("在位置 " +p + "完全匹配");}
}

NextUtil.java

package leaning.string.KMP;public class NextUtil {/*** * 得到next数组 * */public static int[] getNext( String targetStr) {if(targetStr==null) return null;char[] targetModify = KMPStringUtil.stringToChar(targetStr); // 将targetStr字符串改为字符数组int length = targetStr.length();// 得到next数组int i,j;i = 1 ;j = 0 ;int next[] = new int[IntArrayLength.length];while( i < length){if(j == 0 || targetModify[i] == targetModify[j]){ // targetModify[i]表示后缀单个字符, targetModify[j]表示前缀的单个字符 ++i;++j;next[i] = j ;}else{j = next[j]; // 若字符不同,则 j 进行回溯}}return next;}  public static void main(String args[]){String targetStr = "ababaaaba" ;int next[] = NextUtil.getNext(targetStr);for(int i = 0 ; i < next.length ; i++){System.out.print(next[i] + " ");}}}

IntArrayLength.java

package leaning.string.KMP;public  class IntArrayLength {public  static int length = 255;
}

KMPStringUtil.java

package leaning.string.KMP;public class KMPStringUtil {public static char[] stringToChar(String source){/*** 对source进行改造,使其第一位为一个占位符*    source =    a b c d e f g h* targetModify = '' a b c d e f g h * * */char[] targetModify = new char[source.length()+1];int length = source.length() ; for(int i = 0 ; i < source.length() ; i++){targetModify[i+1] = source.charAt(i);}return targetModify;} }

3 运行结果

运行 KMP.java 得到下面结果

KMP算法 java版本相关推荐

  1. 贪心算法(Java版本)

    一.贪心算法 1.算法描述 贪心算法(Greedy algorithm),又叫做贪婪算法. 在对问题求解时,不从整体考虑,而是从问题的某一个初始解出发,每一步选择中都采取在当前状态下最好或最优的选择( ...

  2. 微博短链接的生成算法(Java版本)

    最近看到微博的短链接真是很火啊,新浪.腾讯.搜狐等微博网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责 ...

  3. 字符串匹配算法(KMP算法JAVA版)

    目录 暴力匹配 KMP算法 暴力匹配 暴力算法就是 普通模式的匹配算法 bf算法就是将目标的字符串 的第一个字符与模式的第一个字符进行匹配,相等的话就继续比较第二个字符是否是匹配的,依次进行下去,如果 ...

  4. java短链接原理_微博短链接的生成算法(Java版本)

    最近看到微博的短链接真是很火啊,新浪.腾讯.搜狐等微博网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责 ...

  5. 微博短链接的生成算法(Java 版本)

    最近看到微博的短链接真是很火啊,新浪.腾讯.搜狐等微博网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责就 ...

  6. 新浪微博短链接的生成算法(Java版本)

    最近看到微博的短链接真是很火啊,新浪.腾讯.搜狐等微博网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责 ...

  7. KMP算法----java实现

    字符串的模式匹配本文先实现最基本的回溯实现的已经KMP算法,BM算法后面博文继续实现.ps:本篇博文强烈参考了July大神的作品,地址http://blog.csdn.net/v_july_v/art ...

  8. 经典算法--Java版本

    算法 1.二分查找算法 二分查找算法(非递归)介绍 前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将 ...

  9. 银行家算法JAVA版本

    银行家算法 摘要:银行家算法来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行家资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还.在操作系统中研究资源分配策略时也有类似 ...

最新文章

  1. jqueryrotate 使用 帮助 笔记 学习
  2. phalcon系列(1) hello phalcon
  3. 当 RocketMQ 遇上 Serverless,会碰撞出怎样的火花?
  4. tensorflow随笔-条件循环语句求解一元多次方程
  5. JavaFX控制器:设置按钮点击事件代码示例
  6. fedora删除旧版本内核
  7. 【MyBiatis框架】原生态Jdbc的弊端已经Mybatis简介
  8. python中try...except的用法_python try...except语句、自定义异常、raise语句使用实例(异常处理的三种方法)...
  9. JSP 内置对象request常见用法
  10. linux时间戳转时间
  11. Zim-个人wiki系统
  12. Could not load requested class
  13. ELEMENT UI中关于上传图片el-upload控件删除(同时删除后台图片信息)
  14. 第11课:词句分布式表达——词建模工具
  15. 龙芯3U板卡学习资料第706篇: GEC-2K1000 龙芯3U板卡
  16. 【技术方案】一对一或一对多音视频通话会议系统,可以通过哪些方式实现?
  17. 计组头哥实验 第2关 原码一位乘法器设计
  18. 原始套接字编程——Teardrop
  19. 拯救剧荒,程序员最爱看的高分美剧TOP10
  20. 电缆 电流_如何不用电缆观看每项运动(运动返回时)

热门文章

  1. PAT1053 住房空置率 (20 分)
  2. PAT甲级 -- 1148 Werewolf - Simple Version (20 分)
  3. jQuery的val()方法
  4. 【简洁代码】1028 List Sorting (25 分)_26行代码AC
  5. 【解题报告+通法】_九宫幻方 蓝桥杯 2017年C组第八题(dfs解法)
  6. python mongodb查询_Python MongoDB 查找
  7. python双向索引什么意思_python字典支持双向索引吗
  8. 企业日志分析ELK(Logstash+Elasticsearch+Kibana)介绍及搭建
  9. smarty去除html标签,Smarty与脚本中的html标签爆裂
  10. shell脚本详解(八)——一键部署自动化装机(PXE无人值守)