KMP算法 java版本
来源:互联网 发布:软考程序员考什么 编辑:程序博客网 时间:2024/06/06 23:16
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 得到下面结果
0 0
- KMP算法 java版本
- KMP算法(java版本)
- KMP算法实现C和java版本
- 对KMP的理解,以及kmp算法java版本实现
- 字符串匹配算法——Sunday算法和KMP算法(java版本)
- kmp算法的弱化版本 mp算法
- java实现kmp算法
- KMP算法java实现
- Java实现KMP算法
- KMP算法java实现
- KMP算法----java实现
- KMP算法 -java版
- KMP算法java实现
- KMP算法Java实现
- 字符串KMP算法-java
- KMP 算法 java实现
- Java实现KMP算法
- KMP算法java
- android开发中 ScrollView当显示超出当前页面时自动移动到最底端
- iOS面试题七
- 互联网用户授权协议OAuth
- android自定义view实现可自由放大缩小和移动的imageView
- Java ThreadPoolExecutor线程池原理及源码分析
- KMP算法 java版本
- <备战蓝桥杯之嵌入式>——SYSTICK
- STL sort源码剖析(转)
- java(16)--利用session防止重复登录操作
- 算法学习之字符串包含
- 数据结构: 数组与字符串问题
- iOS 对象等同性
- greenplum list
- <备战蓝桥杯之嵌入式>——BUTTON按键实验