串的模式匹配(二)---KMP算法

2023-11-12

改进的模式匹配算法

KMP算法的优点:主串不回溯。

KMP算法的时间复杂度为O(m+n)

字符串的前缀:除最后一个字符以外,所有头部子串。
字符串的后缀:除第一个字符以外,所有尾部子串。
PM数组是部分匹配值,部分匹配值是字符串的前缀和后缀的最长相等前后缀长度。
以abca举例:
‘a’,前后缀均为空集,即最长相等前后缀长度为0;
‘ab’,前缀是{ a },后缀是{ b },最长相等前后缀长度是0;
‘abc’,前缀是{ a, ab },后缀是{ c, bc },最长相等前后缀长度是0;
‘abca’,前缀是{ a, ab, abc },后缀是{ a, ca, bca },最长相等前后缀长度是1;

表1 PM表

编号 1 2 3 4
T a b c a
PM 0 0 0 1

我们使用部分匹配值(PM)主要是为了求解移动位数

移动位数 = 已匹配的字符数 ➖ 对应的部分匹配值

而next数组是由PM数组右移然后加一所得。

表2 next表

编号 1 2 3 4
T a b c a
next 0 1 1 1
public class StringMatching {	
	//计算next数组
	static void get_next(char T[], int next[]) {
		int i=1,j=0;
		while(i<T.length) {
			if(j == 0 || T[i] == T[j]) {
				
				i++;
				j++;
				next[i]=j;
				
			}else {
				j=next[j];
			}
				
		}
		
	}
	//KMP匹配算法
	static int Index_KMP(char S[], char T[], int next[]) {
		int i=1,j=1;
		//get_next(T,next);
		while(i<S.length && j<T.length) {
			if(j == 0 || S[i] == T[j]) {
				i++;j++;
			}else
				j=next[j];
		}
		if(j>=T.length)
			return i-T.length;
		else
			return 0;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String S = "cdababcadfgh";
		String T = "abca";
		int next[]=new int[20];//初始化next数组
		get_next(T.toCharArray(),next); //next值
		System.out.println("next数组:");
		for(int i=1;i<=T.length();i++) {
			System.out.print(next[i]+" ");
		}
		System.out.println();
		int id = Index_KMP(S.toCharArray(),T.toCharArray(),next);
		if(id == 0) {
			System.out.print("匹配失败!");
		}else {
			System.out.print("匹配成功!字符串T在字符串S的第"+id+"的位置。");
		}
		
	}

}

其实一般情况下,暴力匹配的实际执行时间近似为KMP,因此暴力匹配至今仍被采用,但在主串与子串有许多“部分匹配”的时候,KMP算法就明显速度快于暴力匹配算法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

串的模式匹配(二)---KMP算法 的相关文章

随机推荐

  • 通过less或者scss 定义变量 实现 vue主题切换

    更新 不需要全局引入less或者scss的可以直接在body上面挂载css变量 body baseColor 4F94FA activeColor 4F94FA fontColor 4F94FA 然后在需要使用的地方 title color
  • python 深拷贝和浅拷贝浅析

    简单点说 1 copy copy 浅拷贝 只拷贝父对象 不会拷贝对象的内部的子对象 id会变化2 copy deepcopy 深拷贝 拷贝对象及其子对象 id会变化 gt gt gt import copy gt gt gt a 1 2 3
  • WAV文件格式解析

    来源 http www codeguru com cpp g m multimedia audio article php c8935 PCM Audio and Wave Files htm page 1 源程序下载地址 http www
  • 算法可视化该怎么实现

    算法可视化通常是指将算法的运行过程或结果以图像 动画或交互式图形的形式呈现出来 使得更容易理解和观察 要实现算法可视化 需要使用特定的工具或库 如 图像可视化 可以使用 Python 中的 matplotlib 库或者 JavaScript
  • JavaScript基础——回调(callback)是什么?

    上篇文章 JavaScript基础 你真的了解JavaScript吗 我们明白了JavaScript是一个单线程 非阻塞 异步 解释性语言 清楚了什么是单线程 进程 阻塞 调用堆栈 异步回调 任务循环等概念 没看的或者不清楚的建议点击 Ja
  • mysql 问号作用,在“WHERE column =?”中MySQL中问号的意义是什么?

    在 WHERE column 中MySQL中问号的意义是什么 我正在解剖一些代码 碰到这个 sql SELECT page author name AS author updator name AS updator FROM TABLE P
  • XGBoostError: XGBoost Library (libxgboost.dylib) could not be loaded.

    最初下载xgboost 用的是 pip install xgboost 但是不知道为什么 无法 import xgboost 报错了 然后上网搜了下 给出的是 conda remove xgboost 但是出现了 我反应过来 我是用pip下
  • pwn手记录题2

    fastbin reverse into tcache 2 34 本题所使用的libc版本为2 34 最新版 libc2 34版本已经没有了所谓的hook函数 甚至exit hook 实际为某个函数指针 也已经不能够使用 能够利用的手法已经
  • Linux上查找最大文件的 3 种方法

    作者 CloudDeveloper 来源 公众号 Linux云计算网络 有时候我们在系统上安装了数十个应用程序 随着使用时间的推移 许多文件变得越来越大 从而导致磁盘空间越来越小 那么问题来了 如何找到系统上这些大文件 然后进行一番磁盘空间
  • STM32F4内部Flash读写

    之前的文章中介绍过STM32F0列的内部Flash读写 STM32CubeMX之内部Flash读写 F1系列的也是一样的 而F4系列的单片机与F0和F1略有不同 HAL库对应的函数也不同 今天来简单介绍一下 以TM32F429IGT6单片机
  • 升级Spring Boot内嵌Tomcat版本

    一 为什么要升级内嵌的Tomcat版本 在产品运行迭代过程中 产品所使用的插件 中间件等经常会被爆出各种各样的漏洞 有些威胁比较大的漏洞是需要及时修复的 最近我们就收到通知需要及时升级tomcat的版本以应对tomcat的新漏洞 当前我们的
  • 学习笔记(3):英特尔® OpenVINO™工具套件初级课程-为什么我们需要人工智能

    立即学习 https edu csdn net course play 27685 384293 utm source blogtoedu 学到了很多
  • CH340系列介绍和STM32的BOOT模式选择烧录模式

    你是否在疑惑网上买的32最小系统无法串口烧录 你是否在疑惑STM32的BOOT引脚有什么作用 本篇文章将帮你解答 目录 一 CH340系列介绍 1 CH340N CH340G CH340B芯片介绍 原理图 2 USB总线转串口的电路图连接与
  • Linux网络协议之IP协议(网络层)

    Linux网络协议之IP协议 网络层 文章目录 Linux网络协议之IP协议 网络层 1 IP协议基本概念 2 IPV4协议格式 3 分片与组装 4 IP网段划分 4 1 IP地址组成 4 2 IP地址分类 4 3 特殊的IP地址 4 4
  • Red5应用开发(三) 点播

    Red5点播默认只支持RTMP协议的点播地址 RTSP和HLS需要使用插件的形式进行配置 插件需要自己编译 很多依赖有问题 后期有需求再更新 Github 仓库地址 利用Red5的Eclipse插件生成的默认Red5工程即可直接作为点播应用
  • 明明连上网络了,微信也可以使用,但是浏览器不能上网:修复浏览器不能上网问题

    把 使用代理服务器 关上就行
  • 02_1_Qt工程实践_QtCreator中qmake、构建、运行、清理等区别与联系(关于makefile, make、qmake基础知识)

    比较好的关于makefile及在linux下的使用的资料可参考以下链接 狄泰软件学院 操作系统篇之 makefile专题 总结放于前 一个工程编译连接规则是放于Makefile文件中的 qmake是用于在qtcreate下生成Makefil
  • 46 openEuler搭建Nginx服务器-管理Nginx

    文章目录 46 openEuler搭建Nginx服务器 管理Nginx 46 1 概述 46 2 前提条件 46 3 启动服务 46 4 停止服务 46 5 重启服务 46 6 验证服务状态 46 openEuler搭建Nginx服务器 管
  • C语言一个栈的实现

    栈是常用的数据结构之一 下面给出一个链式栈的实现 头文件Stack h cpp view plain copy ifndef Stack H define Stack H typedef int Item typedef struct no
  • 串的模式匹配(二)---KMP算法

    改进的模式匹配算法 KMP算法的优点 主串不回溯 KMP算法的时间复杂度为O m n 字符串的前缀 除最后一个字符以外 所有头部子串 字符串的后缀 除第一个字符以外 所有尾部子串 PM数组是部分匹配值 部分匹配值是字符串的前缀和后缀的最长相