当前位置: 首页 > news >正文

java实现一个kmp算法

1、什么是KMP算法

      Kmp 算法是由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,改进字符串匹配的算法;

      Kmp 算法的核心是利用匹配失败的信息,尽量减少模式串与主串的匹配次数,以达到

      快速匹配的目的;

      Kmp 算法的时间复杂度是O(m+n),m=模式串的长度,n=主字符串的长度

2、示例代码

/*** Kmp算法练习1:* 1、什么是Kmp算法?* Kmp 算法是由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,改进字符串匹配的算法;* Kmp 算法的核心是利用匹配失败的信息,尽量减少模式串与主串的匹配次数,以达到快速匹配的目的;* Kmp 算法的时间复杂度是O(m+n),m=模式串的长度,n=主字符串的长度***/
public class KMPDemo01 {/**** @param str 主字符串* @param p  要查找的字符串,即模式串* @return*/public int kmp(String str,String p){if(str == null || "".equals(str.trim()) || p == null || "".equals(p.trim())){return -1;}int[] next = new int[p.length()];int i=0,j=0;/*** 1、计算模式串的next数组*/next(next,p);/*** 匹配过程*/while (i<str.length() && j<p.length()){//当主字符串与模式串的字符匹配时,主字符串坐标i和模式字符串坐标j同时增加//否则,模式字符串坐标j回溯if(j == -1 || str.charAt(i) == p.charAt(j)){i++;j++;}else {/*** j 回退,返回上一个满足条件的位置*/j = next[j];}}if((i - p.length()) >= 0){return i - p.length();}return -1;}/*** next数组的计算* 数组 next 保存每次遇到字符不一样的上一个的位置* 对于模式串p的每个位置j,next[j]表示p[0,j-1]的最长相等前后缀子串的长度** @param next* @param p*/private void next(int[] next,String p){int j = 0;int k = -1;next[0] = -1;while (j< p.length() - 1){if(k == -1 || p.charAt(k) == p.charAt(j)){k++;j++;if(p.indexOf(k) == p.indexOf(j)){next[j] = next[k];}else {next[j] = k;}}else {/*** k回退,获取上一步的k*/k = next[k];}}}public static void main(String[] args) {KMPDemo01 kmp = new KMPDemo01();String str = "12324abc567";String p = "ab";int index = kmp.kmp(str,p);System.out.println(" ****** index ****** "+index);}}

http://www.lryc.cn/news/513593.html

相关文章:

  • 强化学习方法分类详解
  • 雅思真题短语(二十八)
  • 在Linux系统中使用字符图案和VNC运行Qt Widgets程序
  • Python基于EasyOCR进行路灯控制箱图像文本识别项目实战
  • Github 2024-12-28 Rust开源项目日报 Top10
  • 提升生产力工具
  • 【蓝桥杯——物联网设计与开发】系列前言
  • 【Java基础】02.Java数据类型
  • Python爬虫(一)- Requests 安装与基本使用教程
  • 线段树保姆级教程
  • logback之自定义过滤器
  • 如何用CSS3创建圆角矩形并居中显示?
  • Java 开发中的指定外部 Jar 路径详解
  • python爬虫--小白篇【selenium自动爬取文件】
  • TI毫米波雷达原始数据解析之Lane数据交换
  • overscroll-behavior-解决H5在ios上过度滚动的默认行为
  • Nacos配置中心总结
  • rouyi(前后端分离版本)配置
  • 超大规模分类(一):噪声对比估计(Noise Contrastive Estimation, NCE)
  • Windows 下安装 triton 教程
  • 复盘与导出工具最新版9.15重磅发布-全新UI兼容所有windows系统
  • 家用电器销售系统|Java|SSM|JSP|
  • NRF24L01模块通信实验
  • 2024年12月CCF-GESP编程能力等级认证Scratch图形化编程三级真题解析
  • 【MySQL系列】VARCHAR为啥一般是255
  • 图文教程:使用PowerDesigner导出数据库表结构为Word/Html文档
  • Coroutine 基础五 —— Flow 之 Channel 篇
  • 快速掌握Elasticsearch检索之二:滚动查询(scrool)获取全量数据(golang)
  • C++设计模式:状态模式(自动售货机)
  • 【网络安全实验室】脚本关实战详情