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

6. 数据结构—串的匹配算法

1.BF算法(暴力算法)

//模式匹配(暴力算法) 
int Index(SString S,SString T){int i=1,j=1;while(i<=S.length&&j<=T.length){if(S[i]==T[i]){i++;j++;}else{i=i-j+2;  //最开始匹配的位置的后一个j=1;      //从头匹配	}}if(j>T.length)return i-T.length;return return 0; 
}

时间复杂度分析O(mn)

假设主串长度为n,待匹配的串长度为m,则最坏时间复杂度为O(nm)。

主串最多需要匹配n-m+1次,每次最多匹配m次(匹配到最后一个发现不匹配了),

所以也就是(n-m+1)*m=nm-m^2+m,因为一般都是n>>m,所以后面的-m^2+m可以省略,也就是O(nm)的时间复杂度。

tips:时间复杂度除非特别指明,一般就是最坏时间复杂度。

2. KMP算法

next[j]表示:当第j个子串的第i个字符与主串发生失配的时候,跳到子串的next[j]位置重新与主串当前位置进行比较。

tips:next[0]=0,next[1]=1(这两始终保持不变)

时间复杂度:O(m+n)

假设主串长度为n,待匹配的串长度为m,则最坏时间复杂度为O(m+n)。

分为两个大步骤:求next[]和匹配。

求next[]:需要对待匹配串进行一个遍历,也就是,次

匹配:需要对主串进行遍历(不回溯),最多n次。

因此最坏时间复杂度为O(m+n)。

3. KMP进一步优化

简单来说,在next[j]基础上进一步修改,

如果p[j]=p[next[j]],那么next[j]=next[next[j]]。

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

相关文章:

  • 九大服务架构性能优化方式
  • 【RabbitMQ】 相关概念 + 工作模式
  • 嵌入式学习 ——(Linux高级编程——进程)
  • C++练习备忘录
  • 改善工作流
  • 迭代器失效
  • @RequestParam @RequestBody @PathVariable 这三个注解对应的前端使用vue的http请求时不同的调用方式
  • SQL - 索引
  • Oracle23ai新特性FOR LOOP循环控制结构增强
  • DHU OJ 二维数组
  • UDP/TCP --- Socket编程
  • 【C语言】最详细的单链表(两遍包会!)
  • QT:VS2019 CMake编译CEF
  • day31(8/19)——静态文件共享、playbook
  • 白骑士的C#教学实战项目篇 4.4 游戏开发
  • 在Vue工程中开发页面时,发现页面垂直方向出现两个滚动条的处理
  • 【C++初阶】:C++入门篇(一)
  • 【JAVA CORE_API】Day14 Collection、Iterator、增强for、泛型、List、Set
  • Go更换国内源配置环境变量
  • 澎湃认证显实力,浪潮信息存储兼容新篇章
  • Leetcode 3255. Find the Power of K-Size Subarrays II
  • Kotlin学习02-变量、常量、整数、浮点数、操作符、元组、包、导入
  • C++的模板简介
  • 树莓派5 笔记25:第一次启动与配置树莓派5_8G
  • Melittin 蜂毒肽;GIGAVLKVLT TGLPALISWI KRKRQQ
  • day32
  • 【clickhouse】 使用 SQLAlchemy 连接 ClickHouse 数据库的完整指南
  • 按键收集单击,双击和长按
  • 进程的异常终止
  • 并发编程 | Future是如何优化程序性能