KMP算法 java版本
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版本相关推荐
- 贪心算法(Java版本)
一.贪心算法 1.算法描述 贪心算法(Greedy algorithm),又叫做贪婪算法. 在对问题求解时,不从整体考虑,而是从问题的某一个初始解出发,每一步选择中都采取在当前状态下最好或最优的选择( ...
- 微博短链接的生成算法(Java版本)
最近看到微博的短链接真是很火啊,新浪.腾讯.搜狐等微博网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责 ...
- 字符串匹配算法(KMP算法JAVA版)
目录 暴力匹配 KMP算法 暴力匹配 暴力算法就是 普通模式的匹配算法 bf算法就是将目标的字符串 的第一个字符与模式的第一个字符进行匹配,相等的话就继续比较第二个字符是否是匹配的,依次进行下去,如果 ...
- java短链接原理_微博短链接的生成算法(Java版本)
最近看到微博的短链接真是很火啊,新浪.腾讯.搜狐等微博网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责 ...
- 微博短链接的生成算法(Java 版本)
最近看到微博的短链接真是很火啊,新浪.腾讯.搜狐等微博网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责就 ...
- 新浪微博短链接的生成算法(Java版本)
最近看到微博的短链接真是很火啊,新浪.腾讯.搜狐等微博网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责 ...
- KMP算法----java实现
字符串的模式匹配本文先实现最基本的回溯实现的已经KMP算法,BM算法后面博文继续实现.ps:本篇博文强烈参考了July大神的作品,地址http://blog.csdn.net/v_july_v/art ...
- 经典算法--Java版本
算法 1.二分查找算法 二分查找算法(非递归)介绍 前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将 ...
- 银行家算法JAVA版本
银行家算法 摘要:银行家算法来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行家资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还.在操作系统中研究资源分配策略时也有类似 ...
最新文章
- jqueryrotate 使用 帮助 笔记 学习
- phalcon系列(1) hello phalcon
- 当 RocketMQ 遇上 Serverless,会碰撞出怎样的火花?
- tensorflow随笔-条件循环语句求解一元多次方程
- JavaFX控制器:设置按钮点击事件代码示例
- fedora删除旧版本内核
- 【MyBiatis框架】原生态Jdbc的弊端已经Mybatis简介
- python中try...except的用法_python try...except语句、自定义异常、raise语句使用实例(异常处理的三种方法)...
- JSP 内置对象request常见用法
- linux时间戳转时间
- Zim-个人wiki系统
- Could not load requested class
- ELEMENT UI中关于上传图片el-upload控件删除(同时删除后台图片信息)
- 第11课:词句分布式表达——词建模工具
- 龙芯3U板卡学习资料第706篇: GEC-2K1000 龙芯3U板卡
- 【技术方案】一对一或一对多音视频通话会议系统,可以通过哪些方式实现?
- 计组头哥实验 第2关 原码一位乘法器设计
- 原始套接字编程——Teardrop
- 拯救剧荒,程序员最爱看的高分美剧TOP10
- 电缆 电流_如何不用电缆观看每项运动(运动返回时)
热门文章
- PAT1053 住房空置率 (20 分)
- PAT甲级 -- 1148 Werewolf - Simple Version (20 分)
- jQuery的val()方法
- 【简洁代码】1028 List Sorting (25 分)_26行代码AC
- 【解题报告+通法】_九宫幻方 蓝桥杯 2017年C组第八题(dfs解法)
- python mongodb查询_Python MongoDB 查找
- python双向索引什么意思_python字典支持双向索引吗
- 企业日志分析ELK(Logstash+Elasticsearch+Kibana)介绍及搭建
- smarty去除html标签,Smarty与脚本中的html标签爆裂
- shell脚本详解(八)——一键部署自动化装机(PXE无人值守)