Sunday 算法详解
创始人
2024-03-24 13:34:19
0

Sunday 算法

Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。

一、匹配机制

匹配机制非常容易理解:

  • 目标字符串 String
  • 模式串 Pattern
  • 当前查询索引 idx (初始为 0)
  • 待匹配字符串 str_cut : String [ idx : idx + len(Pattern) ]

每次匹配都会从 目标字符串中 提取 待匹配字符串模式串 进行匹配:

  • 若匹配,则返回当前 idx
  • 不匹配,则查看 待匹配字符串 的后一位字符 c
    1. c 存在于 Pattern 中,则 idx = idx + 偏移表[c]
    2. 否则,idx = idx + len(pattern)

循环上述匹配过程直到 idx + len(pattern) > len(String)

二、偏移表

偏移表的作用是存储每一个在 模式串 中出现的字符,在 模式串 中出现的最右位置到尾部的距离 +1,例如 aab:

  • a 的偏移位就是 len(pattern)-1 = 2
  • b 的偏移位就是 len(pattern)-2 = 1
  • 其他的均为 len(pattern)+1 = 4

综合一下:

shift[w]={m−max{im−max{i

三、举例

String: checkthisout Pattern: this

Step 1:
在这里插入图片描述

  • idx = 0
  • 待匹配字符串为:chec
  • 因为 chec != this
  • 所以查看 chec 的下一个字符 k
  • k 不在 Pattern 里
  • 所以查看 偏移表idx = idx + 5

Step 2:
在这里插入图片描述

  • idx = 5
  • 待匹配字符串为:this
  • 因为 this == this
  • 匹配,所以返回 5

四、算法分析

时间复杂度: 最坏情况 O(nm)O(nm)O(nm) ,平均情况 O(n)O(n)O(n)
空间复杂度: O(c)O(c)O(c),c为位移表长度

五、代码实现

class Solution:def strStr(self, haystack, needle):haystack_length = len(haystack)needle_length = len(needle)return self.sunday(haystack, haystack_length, needle, needle_length)def sunday(self, s, s_len, p, p_len):bc_move_dict = self.badChatMove(p, p_len)now = 0# 如果匹配字符的位置到达两字符串长度的差值,则不可能存在匹配字串,则退出循环while now <= s_len - p_len:# 比对当前位置的子串是否和模式串匹配if s[now: now+p_len] == p:return now# 如果以及到达两字符串长度的差值,那么这将是最后一个可能匹配到的子串# 经过上面的比对没有匹配的话,直接返回-1if now == s_len - p_len:return -1# 更新下标,如果模式串不包含匹配串后面的第一个字符,则移动 p_len+1 个位数now += bc_move_dict.get(s[now+p_len], p_len+1)return -1# 坏字符移动数量计算def badChatMove(self, p, p_len):bc_move_dict = dict()for i in range(p_len):# 记录该字符在模式串中出现的最右位置到尾部的距离+1bc_move_dict[p[i]] = p_len - ireturn bc_move_dict

参考文章

<>

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...