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. java 中的 serialVersionUID
  2. install openstack on single host
  3. CG CTF MISC Remove Boyfriend
  4. Java基础之HashMap流程分析
  5. 修改数据表部分字段方法封装-及-动态生成对象并动态添加属性
  6. 【转】温故之.NET 异步
  7. php curl 批量,关于用php的curl批量抓取内容
  8. 如何在20分钟内批量部署20台ESXi服务器?
  9. Spring+SpringMVC+MyBatis+Maven框架整合
  10. od拦截消息 comboboxonchange_某聊天软件逆向之偷看消息不quot;已读quot;
  11. H5实现打印电子面单(淘宝菜鸟物流)
  12. 【UWB】UWB基本定位原理
  13. 微软的产品激活中心电话
  14. Excel快速填充列
  15. 谁能辨我是雄雌?轩墨宝宝个人资料,轩墨宝宝CP照!
  16. inputBox 与 Application.inputBox 的用法与区别。
  17. android系统裁剪优化
  18. 风光过后就崩溃,互联网公司让你心好累
  19. 30系列NVIDIA显卡安装tensorflow 极简
  20. 2023在家赚钱怎么做,有什么适合在家做的副业项目

热门文章

  1. 如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service
  2. SAP API Business Hub 上测试 API 的一些常见问题
  3. Adding Applications for JavaScript Storefronts in SAP 电商云
  4. SAP Spartacus 服务器端渲染文件 server.js 和构建后的 main.js 对比
  5. SAP Spartacus Visible Focus
  6. SAP Spartacus的用户登录页面设计
  7. Kyma registration of webservices and event endpoints
  8. 把经典的ABAP webdynpro应用配置到SAP Fiori Launchpad里
  9. BP contact search in Fiori ui
  10. 使用pscp从windows电脑拷贝数据到linux遇到的ssh_init错误