import java.util.Arrays;

public class KMP {

private static int[] prefixTable;

/**

* 部分匹配表

* @param t

* @return

*/

public int[] getPrefixTable(char[] t){

int n = t.length;

int len;//匹配位置

prefixTable = new int[n];

prefixTable[0] = 0;

for(int i = 1;i < n;i++){

len = prefixTable[i - 1];

while(true){

if(t[len] == t[i]){

len++;

prefixTable[i] = len;

break;

}else{

if(len > 0)//下一个比较位置

len = prefixTable[len - 1];

else{

prefixTable[i] = 0;//

break;

}

}

}

}

return prefixTable;

}

public int[] match(char[] s,char[] t){

int[] result = new int[s.length];//记录所有匹配的子串

int count = 0;

int j = 0;//记录子串匹配位置

for(int i = 0;i < s.length;i++){

if(s[i] == t[j]){//相等

if(j == t.length - 1){//子串匹配完毕,记录位置,并且j=0找下一个匹配的子串

result[count++] = i - t.length + 1;

j = 0;

}else{//子串匹配位置加1

j++;

}

}else{

if(j > 0){//如果子串位置>0

j = prefixTable[j - 1];//不匹配的话从匹配表里面找到子串新的匹配位置

i--;//接着比较

}

}

}

return result;

}

public static void main(String[] args) {

KMP kmp= new KMP();

char[] s = "ABCDAB ABCDABCDABDEABCDABD".toCharArray();

char[] t = "ABCDABD".toCharArray();

kmp.getPrefixTable(t);

int index[] = kmp.match(s, t);

System.out.println(Arrays.toString(index));

}

}

输出结果

[11, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

java kmp算法_KMP算法java版实现相关推荐

  1. 常用十大算法_KMP算法

    KMP算法 FBI提示:KMP算法不好理解, 建议视频+本文+其他博客,别走马观花 KMP算法是用于文本匹配的算法,属于模式搜索(pattern Searching)问题的一种算法,在讲KMP算法之前 ...

  2. IDEA配置java《算法》第四版环境(耗时6小时,总算配置成功了,希望能给大家一点帮助)

    0.前言 最近在学java语言,然后想用java语言来学习算法,在网上听说看<算法>第四版学习java算法不错,于是就去下载了<算法>电子书来啃 今天看到了用java java ...

  3. 经典KMP算法C++与Java实现代码

    前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比 ...

  4. 数据结构与算法基础(java版)

    目录 数据结构与算法基础(java版) 1.1数据结构概述 1.2算法概述 2.1数组的基本使用 2.2 数组元素的添加 2.3数组元素的删除 2.4面向对象的数组 2.5查找算法之线性查找 2.6查 ...

  5. java动态分区分配算法,操作系统_动态分区分配算法课程设计_java版

    <操作系统_动态分区分配算法课程设计_java版>由会员分享,可在线阅读,更多相关<操作系统_动态分区分配算法课程设计_java版(13页珍藏版)>请在人人文库网上搜索. 1. ...

  6. java动态分区分配_操作系统 动态分区分配算法课程设计 java版.pdf

    操作系统 动态分区分配算法课程设计 java版 湖 南 文 理 学 院 实 验 报 告 课程名称 操作系统课程设计 实验名称 存储管理--动态分区分配算法的模拟 成绩 学生姓名 曹乐 专业 计算机 班 ...

  7. 计算车号Java,汽车VIN码校验算法 java版

    汽车17 位vin 码校验算法 1.[代码][Java]代码 import java.util.HashMap; import java.util.Map; public final class Vi ...

  8. java动态分区分配_操作系统动态分区分配算法课程设计java版解析.doc

    湖 南 文 理 学 院 实 验 报 告 课程名称 操作系统课程设计 实验名称 存储管理--动态分区分配算法的模拟 成绩 学生姓名 曹乐 专业 计算机 班级.学号 13101 18 同组者姓名 实验日期 ...

  9. java青蛙过河打字_趣味算法——青蛙过河(JAVA)

    青蛙过河是一个非常有趣的智力游戏,其大意如下: 一条河之间有若干个石块间隔,有两队青蛙在过河,每队有3只青蛙,这些青蛙只能向前移动,不能向后移动,且一次只能有一只青蛙向前移动.在移动过程中,青蛙可以向 ...

最新文章

  1. [导入]ExtJs 2.0 弹窗事例
  2. 初谈SQL Server逻辑读、物理读、预读
  3. Android之集成微信登录
  4. Javascript深入浅出
  5. 论文笔记之:End-to-End Localization and Ranking for Relative Attributes
  6. Docker学习笔记之保存和共享镜像
  7. 历年软件设计师下午考试试题汇总统计(更新至2016年上半年)
  8. 1030 Travel Plan (30 分) 【难度: 中 / 知识点: 最短路】
  9. Jenkins 设置镜像_Windows Docker Agent 镜像可以常规使用了
  10. linux uid 内核,Linux内核学习笔记: uid之ruid,euid,suid
  11. python怎么连接MongoDB数据库
  12. 阿里云、小米、华为手机竞争对比初评
  13. c程序设计第五版谭浩强课后答案 第四章习题答案
  14. 北京租房住起来舒服的地方(小区)有哪些?
  15. xss.haozi练习通关详解
  16. 关于IDEA中使用git更新代码,会覆盖掉未提交的新代码解决问题
  17. 八边形类 Octagon
  18. 微信小程序自动保留空格换行
  19. Self6D: Self-Supervised Monocular 6D Object Pose Estimation论文翻译
  20. 无线局域网和蜂窝移动网络_广场无线AP覆盖系统解决方案

热门文章

  1. TypeScript里对数组元素的自定义属性排序的实现原理
  2. SAP Spartacus使用到的技术栈
  3. jasmine里不同it spec之间的测试隔离性
  4. nz-input-group is not a known element的解决方法
  5. jsp项目手动导出成war包
  6. SAP扫盲系列之二:SAP ABAP应用服务器的组成部分
  7. SAP Commerce Cloud(原Hybris)和SAP Cloud for Customer(C4C)的SQL trace工具
  8. how is crmd_product_i inserted to db
  9. Angular self study 1 - Bootstrap
  10. Cloud for Customer的前台请求是怎么发送到后台的