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

数据结构-4.4.朴素模式匹配算法

一.专业术语:

注:子串和模式串有区别。


二.朴素模式匹配算法:

思路:在主串中找出所有与模式串长度相等的子串,与模式串进行比较,如果找到了,返回子串第一个字符在主串的位置

1.使用字符串的基本操作实现朴素模式匹配算法:

2.不使用字符串的基本操作实现朴素模式匹配算法:

思路:先在主串中找出所有与模式串长度相等的子串,设置两个指针,一开始分别指向主串子串模式串的第一个字

符,这两个指针指到哪儿就把字符对比到哪儿,一开始比第一个字符,如果相等,这两个指针都后移继续比较下一

个字符,不相等的话将主串中下一个与模式串长度相等的子串和模式串进行比较,以此类推:

上述图片中j当前的值说明匹配到子串中的第几个字符,i-j让i的值回到目前子串的前面一个位置,因为i和j此时一起向前移,但最终是想让主串指针i指向下一个子串的第一个位置,因此要加2,最终i=i-j+2:

经过一系列匹配,最终在主串中找到了与模式串相等的子串,此时模式串里的指针j最终指向了模式串外的一个位置:

3.代码:其中主串为S,模式串为T,i和j为分别指向主串子串模式串的第一个字符的指针

最终匹配失败返回0较好,因为主串S中0索引上不存元素,返回0相当于返回一个不存在的内容;

对于时间复杂度:

先考虑最坏的情况:首先主串中第一个长度和模式串相同的子串与模式串相比较,比到模式串最后一个字符才发现有不同的,换到主串中第二个长度和模式串相同的子串与模式串相比较,也是比到模式串最后一个字符才发现有不同的,以此类推(注:主串长度为n,模式串长度为m):

最坏的情况就是主串中每个子串都要与模式串对比m个字符(也就是比到模式串最后一个字符才发现匹配失败),一共对比

主串中n-m+1个子串即可,所以时间复杂度为O( m * (n-m+1) ) = O( m * n - m * m + m ),等价于O(m * n),注:很多时候

n远大于m(因为主串长度为n,模式串长度即要找的串的长度为m,如一篇文章找一个词,文章远大于词),因此n * m远大

于m * m,所以时间复杂度里m * m可以省掉,m也可以省掉。


三.总结:



http://www.kler.cn/a/349031.html

相关文章:

  • OpenAI 公布了其新 o1 模型家族的元提示(meta-prompt)
  • Docker在linux系统中的下载与使用
  • Android笔记(二十四)基于Compose组件的MVVM模式和MVI模式的实现
  • 教程|插件的搜索与使用(0基础)
  • 【尚硅谷】FreeRTOS学习笔记(更新中更新时间2024.10.12)
  • 【LeetCode】每日一题 2024_10_15 三角形的最大高度(枚举、模拟)
  • SpringBoot项目热部署-devtools
  • QTableView列单元格根据内容调整大小,表头可拖动,设置表头填充满,单元格单选
  • # 执行 rpm -qa | grep qq 查询软件安装情况时报错 数据库损坏 db3 error(-30974)
  • 【Java】单例模式详解与实践
  • Spring Boot异步任务、任务调度与异步请求线程池的使用及原理
  • JAVA基础 day13 多线程
  • 【SQL】深入探索SQL调优:提升数据库性能的全面指南
  • UE5 猎户座漂浮小岛 03 视觉效果 粒子
  • 腾讯云视立方·直播 SDK 个人信息保护规则
  • node.js安装卸载使用
  • MySQL系列—14.锁
  • 让AI像人一样思考和使用工具,reAct机制详解
  • PL/SQL Developer如何连接Oracle数据库(汉化)
  • 基于Spring Boot的医疗病历B2B平台开发策略