算法刷题打卡第36天:找出字符串中第一个匹配项的下标---BM时间复杂度优化(未完成)
创始人
2024-03-20 19:50:08
0

找出字符串中第一个匹配项的下标

难度:中等
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

BM算法:BM时间复杂度优化

思路:
记 haystackhaystackhaystack 为 TTT,needlepneedlepneedlep 为 ppp,对于给定文本串 TTT 与模式串 ppp,先对模式串 ppp 进行预处理。然后在匹配的过程中,当发现文本串 TTT 的某个字符与模式串 ppp 不匹配的时候,根据启发策略,能够直接尽可能地跳过一些无法匹配的情况,将模式串多向后滑动几位。

BMBMBM 算法具体步骤如下:

  1. 计算出文本串 TTT 的长度为 nnn,模式串 ppp 的长度为 mmm。
  2. 设置左指针为 leftleftleft,两个文本串长度差为 differdifferdiffer,differdifferdiffer同时为 leftleftleft 最大移动步长,如果 left<=differleft<=differleft<=differ,则进入循环体,采用 BMBMBM 算法更新 leftleftleft,步骤如下:
    • 如果文本串对应位置 T[i+j]T[i + j]T[i+j] 上的字符与 p[j]p[j]p[j] 相同,则继续比较前一位字符。
      1. 如果模式串全部匹配完毕,则返回 TrueTrueTrue。
    • 如果文本串对应位置 T[i+j]T[i + j]T[i+j] 上的字符与 p[j]p[j]p[j] 不相同,则:
      1. 根据坏字符位置表计算出在「坏字符规则」下的移动距离 bad_characters_movebad\_characters\_movebad_characters_move。
      2. 根据好后缀规则后移位数表计算出在「好后缀规则」下的移动距离 good_suffix_movegood\_suffix\_movegood_suffix_move。
      3. 返回两种移动距离的最大值,即 max(bad_characters_move,good_suffix_move)max(bad\_characters\_move, good\_suffix\_move)max(bad_characters_move,good_suffix_move)。
  3. 如果移动到末尾也没有找到匹配情况,则返回 -1。如果匹配到了,则返回 leftleftleft。

时间复杂度: O(n/m)O(n/m)O(n/m),最坏O(m∗n)O(m*n)O(m∗n)
空间复杂度: O(suffix)O(suffix)O(suffix),suffixsuffixsuffix 为后缀长度,小于模式串 ppp。

class Solution:def strStr(self, haystack: str, needle: str) -> int:def boyerMoore(T: str, p: str) -> int:n, m = len(T), len(p)bc_table = generateBadCharTable(p)      # 生成坏字符位置表gs_list = generageGoodSuffixList(p)     # 生成好后缀规则后移位数表i = 0while i <= n - m:j = m - 1while j > -1 and T[i + j] == p[j]:j -= 1if j < 0:return ibad_move = j - bc_table.get(T[i + j], -1)good_move = gs_list[j]i += max(bad_move, good_move)return -1# 生成坏字符位置表def generateBadCharTable(p: str):bc_table = dict()for i in range(len(p)):bc_table[p[i]] = i          # 坏字符在模式串中最后一次出现的位置return bc_table# 生成好后缀规则后移位数表def generageGoodSuffixList(p: str):m = len(p)gs_list = [m for _ in range(m)]suffix = generageSuffixArray(p)j = 0for i in range(m - 1, -1, -1):if suffix[i] == i + 1:while j < m - 1 - i:if gs_list[j] == m:gs_list[j] = m - 1 - ij += 1for i in range(m - 1):gs_list[m - 1 - suffix[i]] = m - 1 - ireturn gs_listdef generageSuffixArray(p: str):m = len(p)suffix = [m for _ in range(m)]for i in range(m - 2, -1, -1):start = iwhile start >= 0 and p[start] == p[m - 1 - i + start]:start -= 1suffix[i] = i - startreturn suffixreturn boyerMoore(haystack, needle)

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string

上一篇:数据卷(Data Volumes)dockerfile

下一篇:BNext

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...