数据结构与算法学习系列-9-常见的算法-字符串常见算法

字符串常见算法-字符串操作

概念

主串、模式串:
在字符串T中查找字符串P,
T就是主串,P就是模式串
设T的长度为n,P的长度为m

单模式串算法

BF算法
概念

Brute Force 即暴力匹配法,在主串中每次向右移动一个位置,与模式串比较,如果每个字符都相等,则表示在主串中找到模式串

基本实现和特性

在主串T中,检查起始位置分别是[0,1,2,.…n-m]且长度为m的n-m+1个子串,看有没有跟模式串匹配的,时间复杂度为O(m*n)

RK 算法
概念

在BF中,每次在比较模式串和主串子串匹配的时候,都需要依次比较,RK则使用哈希算法对上述过程优化

基本实现和特性

通过哈希算法对主串中的n-m+1个子串分别求哈希值,然后逐个与模式串的哈希值比较大小,如果某个子串的哈希值与模式串相等,就说明子串和模式串匹配

具体步骤:

1.计算子串的哈希值
2.模式串哈希值和子串哈希值的比较

重点:

1.设计哈希算法,扫描一遍计算n-m+1子串的哈希值
2.设计的哈希算法健壮性比较强,可以解决模式串比较长哈希值很大的情况
3.哈希冲突
最好时间复杂度O(n),最坏时间复杂度O(n*m)

BM算法
概念

把主串和模式串的匹配过程看成模式串不停往右滑动,当遇到不匹配的字符时,模式串往后滑动一位,然后从模式串的第一位开始匹配,BM算法借助一些规律将模式串向右多滑动几位

基本实现和特性
算法步骤

1.模式字符串的匹配顺序是从右向左:
(1)首先将P和T对齐,即p[0]和t[0]对齐
(2)然后匹配从模式字符串P的最右端字符开始,即判断p[m]和t[m]是否匹配:
如果匹配成功,则向左移动判断p[m-1]和t[m-1]是否匹配,如此循环下去;如果匹配不成功,则进行字符串滑移
2.字符串滑移启发式策略:
(1)坏字符移动启发式策略
(2)好后缀移动启发式策略
两种策略的使用:
如果同时满足两种策略使用条件时,选两者中较大的作为模式串向右滑移的距离
最坏情况下时间复杂度O(n*m),最好情况下O(n/m)

KMP 算法
概念

跟BM算法非常近似,在模式串和主串匹配的过程中,当遇到那些不可匹配的字符时,希望有某些规律将模式串往右多滑动几位,跳过那些肯定不会匹配的情况

基本实现和特性

重难点:
构建模式串next数组,用来存储模式串中每个前缀的最长可匹配子串的结尾字符下标,时间复杂度O(m+n)

多模式串算法

Trie树
Trie树-概念

也称为字典树,是一个树形结构,
专门用于处理字符串匹配的数据结构
用来解决在一组字符集合中快速查找某个字符串的问题
本质是利用字符串之间的公共前缀,将重复的前缀合并在一起

典型应用: 被搜索引擎系统用于文本词频统计
基本性质:

1.根结点不包括字符,除根结点之外每一个结点都只包含一个字符
2.从根结点到某一结点,路径上经过的字符连接起来,为该结点对应的字符串
3.每个结点的所有子结点包含的字符都不相同
4.Trie树是一个多叉树
5.Trie树是多主串匹配算法

关键操作:

1.将字符集构建Trie树, 时间复杂度O(n)
2.在Trie树中查询一个字符串, 时间复杂度O(k) ,
k是要查找字符的长度

缺点:

Trie树比较消耗内存, 典型的空间换时间思想

Trie树-基本实现和特性
搜索Trie树的方法:

1.从根结点开始一次搜索
2.取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子 树继续进行检索
3.在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索
4.迭代过程…
5.在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找

AC 自动机
概念

AC自动机就是在Trie树之上,加了类似KMP的next数组,只不过此处的next数组是构建在树上

基本实现和特性
重点操作

1.AC自动机的构建
(1)将多个模式串建成Trie树
(2)在Trie树上构建失败指针(类似KMP的next数组)
2.在AC自动机上匹配主串

常考面试题

1.回文子串
2.字符串分割成子串,子串都是回文串
3.在字典中查找某串
4.实现Trie树
5.各种动态规划

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lobster爱前端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值