【算法】字符匹配算法详解与代码实现

在计算机科学中,字符匹配算法是一种在给定文本中查找特定模式的技术。这些算法在各种应用中都发挥着重要作用,包括文本编辑器、搜索引擎、网络安全和生物信息学等。本文将详细介绍两种常用的字符匹配算法:朴素方法和KMP算法。我们还将提供Python代码实现,以便更好地理解这些算法。

1、朴素方法

朴素方法是一种简单的字符匹配算法,其思想是将主串和模式串的元素逐个进行比较。该算法的时间复杂度为O(mn),其中m和n分别是主串和模式串的长度。

算法步骤如下:

(1) 从主串的第一个字符和模式串的第一个字符开始比较。

(2) 如果相等,继续比较下一个字符,直到模式串中的所有字符都与主串中的对应字符相等。

(3) 如果在比较过程中发现不相等,则从主串的下一个字符开始,重新与模式串的第一个字符进行比较。

(4) 重复步骤(2)和(3),直到找到匹配或遍历完整个主串。

以下是Python代码实现:

def naive_search(text, pattern):m = len(text)n = len(pattern)for i in range(m - n + 1):j = 0while j < n and text[i + j] == pattern[j]:j += 1if j == n:return ireturn -1

2、KMP算法

KMP算法是一种改进的字符匹配算法,它在模式串中找到匹配失败的位置,并利用已匹配的信息,通过跳过一部分不必要的比较来提高效率。该算法的时间复杂度为O(m + n),其中m和n分别是主串和模式串的长度。

算法步骤如下:

(1) 预处理模式串,构建一个next数组。next[i]表示当模式串的第i个字符与主串的某个字符不匹配时,应将模式串向右移动的距离。构建next数组的方法是,对于每个位置i,计算其前面出现过的相同的前缀和后缀的长度。

(2) 从主串的第一个字符和模式串的第一个字符开始比较。

(3) 如果相等,继续比较下一个字符,同时根据next数组更新模式串的下一个字符应该与主串的哪个字符进行比较。

(4) 如果在比较过程中发现不相等,根据next数组更新模式串的位置,然后继续比较下一个字符。

(5) 重复步骤(3)和(4),直到找到匹配或遍历完整个主串。

以下是Python代码实现:

def compute_prefix_function(pattern):n = len(pattern)next = [0] * nj = 0for i in range(1, n):while j > 0 and pattern[j] != pattern[i]:j = next[j - 1]if pattern[j] == pattern[i]:j += 1next[i] = jreturn nextdef kmp_search(text, pattern):m = len(text)n = len(pattern)next = compute_prefix_function(pattern)i = 0j = 0while i < m and j < n:if text[i] == pattern[j]:i += 1j += 1else:j = next[j - 1] + 1 if j > 0 else 0if j == n:return i - j + 1return -1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/51505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS中的vertical-align属性

vertical-align 1.CSS属性 - vertical-align 2.深入理解vertical-align – line boxes This property affects the vertical positioning inside a line box of the boxes generated by an inline-levelelement. 官方文档的翻译&#xff1a;vertical-align会影响 行内块级元素…

Android | 关于 OOM 的那些事儿

作者&#xff1a;345丶 前言 Android 系统对每个app都会有一个最大的内存限制&#xff0c;如果超出这个限制&#xff0c;就会抛出 OOM&#xff0c;也就是Out Of Memory 。本质上是抛出的一个异常&#xff0c;一般是在内存超出限制之后抛出的。最为常见的 OOM 就是内存泄露(大量…

Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”

Prompt任务&#xff08;Prompt Tasks&#xff09; 通过设计提示&#xff08;prompt&#xff09;模板&#xff0c;实现使用更少量的数据在预训练模型&#xff08;Pretrained Model&#xff09;上得到更好的效果&#xff0c;多用于&#xff1a;Few-Shot&#xff0c;Zero-Shot 等…

vue中实现将页面或者div内容导出为pdf格式

将Vue单页面转成pdf并下载 步骤1&#xff1a;下载对应的库 npm install html2canvas;npm install jspdf --save 步骤2&#xff1a;创建一个htmlToPdf.js的js文件, 然后在main.js中全局引用一下&#xff0c;编写如下代码&#xff1a; // htmlToPdf.js // 导出页面为PDF格式 …

Spring Boot(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot 前后端分离)【二】

&#x1f600;前言 本篇博文是关于Spring Boot(Vue3ElementPlusAxiosMyBatisPlusSpring Boot 前后端分离)【二】的&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文…

adb shell setprop 、开发者选项

App性能调试详解 Android App性能监控工具 更多系统属性参考 一、开启 GPU Render 的profiling bar&#xff1a; Gpu渲染速度 adb shell setprop debug.hwui.profile true adb shell setprop debug.hwui.profile visual_bars adb shell setprop debug.hwui.profile visual…

基于5G边缘网关的储能在线监测方案

近年以来&#xff0c;光伏、风力、水力发电等产业发展迅速&#xff0c;新能源在电力市场的占比持续增加&#xff0c;已经成为电力系统的重要组成部分。但由于光伏、风力、水力等发电方式存在天然的波动性&#xff0c;因此也需要配套储能、蓄能系统&#xff0c;保障新能源运行和…

股票预测和使用LSTM(长期-短期-记忆)的预测

一、说明 准确预测股市走势长期以来一直是投资者和交易员难以实现的目标。虽然多年来出现了无数的策略和模型&#xff0c;但有一种方法最近因其能够捕获历史数据中的复杂模式和依赖关系而获得了显着的关注&#xff1a;长短期记忆&#xff08;LSTM&#xff09;。利用深度学习的力…

UE4/5Niagara粒子特效之Niagara_Particles官方案例:2.4->3.2

之前的案例 UE4/5Niagara粒子特效之Niagara_Particles官方案例&#xff1a;1.1-&#xff1e;1.4_多方通行8的博客-CSDN博客 UE4/5Niagara粒子特效之Niagara_Particles官方案例&#xff1a;1.5-&#xff1e;2.3_多方通行8的博客-CSDN博客 2.4 Location Events 这次的项目和之…

VUE3封装EL-ELEMENT-PLUS input组件

VUE3封装EL-ELEMENT-PLUS input组件 完整代码 <template><div><div><div class"lable_top" v-if"label"><label :class"lable_sty">{{ label }}</label></div><el-inputv-model"inputValue&…

自动化测试之Selenium

自动化测试Selenium介绍环境搭建如何操作浏览器定位元素css类选择器定位元素xpath定位元素css选择语法xpath选择语法 常用操作添加等待打印信息浏览器更多操作键盘事件鼠标事件特殊场景只选复选框iframe标签下拉框处理弹窗显示上传文件 关闭浏览器切换窗口截图 自动化测试 自动…

JavaSE 认识String类

目录 1 创建字符串2 字符串比较相等3 字符串常量池4 理解字符串不可变5 字符、字节与字符串5.1 字符与字符串5.2 字节与字符串5.3 小结 6 字符串常见操作6.1 字符串比较6.2 字符串查找6.3 字符串替换6.4 字符串拆分6.5 字符串截取6.6 其他操作方法 7 StringBuffer 和 StringBui…

【Linux】文件的描述符和重定向

文件的描述符和重定向 C语言的文件读写操作代码 open系统打开文件方法系统读写文件操作文件描述符文件重定向怎么理解文件缓冲区 C语言的文件读写操作 文件写入 fputs int fputs(const char *s, FILE *stream); s&#xff1a;要写入的字符串 stream&#xff1a;要写入对应的目标…

TCP最大连接数问题总结

最大TCP连接数量限制有&#xff1a;可用端口号数量、文件描述符数量、线程、内存、CPU等。每个TCP连接都需要以下资源&#xff0c;如图所示&#xff1a; 1、可用端口号限制 Q&#xff1a;一台主机可以有多少端口号&#xff1f;端口号与TCP连接&#xff1f;是否能修改&#x…

echarts 之 科技感进度条

1.图片展示 2.代码实现 /* ng qty 进度条 */ <template><div class"ngqty-progress"><div class"ngqty-info"><span>X4</span><span>50%</span></div><div :id"barNgQtyProgress index" c…

Java进阶(7)——手动实现LinkedList 内部node类的实现 增删改查的实现 toString方法 源码的初步理解

目录 引出从ArrayList到Linkedlist手动实现ArrayList从ArrayList到LinkedList 总体设计Node类Node的方法&#xff1a;根据index找node 增删改查的实现增加元素删除元素修改元素查询元素 toString方法完整代码List接口类LinkedList的实现测试类 总结 引出 1.linkedList的节点&am…

从0开始学Python 01

Python学习01 文章目录 Python学习0101-字面量02-注释注释的分类1.单行注释2.多行注释 03-变量04-数据类型1.type()语句 05-数据类型转换常见的转换语句代码演示 06-标识符标识符命名规则1.内容限定&#xff1a;2.大小写敏感&#xff1a;3.不能使用关键字代码示例&#xff1a; …

MySQL Connection not available.

Mysql 报错 最近部署在服务器上的mysql总是报这种错。 但是在服务器上&#xff0c;使用命令行是可以登录进mysq的。 cursor db.cursor() File “/home/ubuntu/miniconda3/envs/chatbot_env/lib/python3.9/site-packages/mysql/connector/connection_cext.py”, line 700, in …

基于JJWT理解JWT,JWS,JWE

JWT &#xff0c; 全写JSON Web Token, 是开放的行业标准RFC7591&#xff0c;用来实现端到端安全验证. 从开发者理解的角度来说&#xff1a; JWT 是一个定义传递信息的标准JWT 的Token是一个Base64编码的字符串&#xff0c; 类似 eyJhbGciOiJIUzI1NyJ9.eyJzdWIiOiJvc2NhciJ9.…

[Python进阶] 类的设计模式

4.11 设计模式 在Python中&#xff0c;类的设计模式是指一种通用的解决方案或设计模板&#xff0c;针对特定的问题或需求构建类结构&#xff0c;并提供相关的方法和属性。这些设计模式可以帮助开发人员遵循最佳实践、提高代码质量、增强可读性、降低维护成本。 需要注意的是&a…