串(字符串)是一种特殊的线性表,其数据元素为字符。如:"abc"。

一、串的定义

由字符构成的有限序列,是一种线性表。

1-1、串的比较

以字符的ASCII值作为依据。比较操作从两个字符串的第一个字符开始,字符的码值大者所在的串大;若其中一个串先结束,以串长较大者为大

0:48

A:65

a:97

1-2、真题

真题1:

真题2:

此类题,套个示例即可。 

二、串的模式匹配

子串的定位操作,称为串的模式匹配。

设有两个串s和t,要在串s中找到与t相等的子串。通常将s称为目标串,t称为模式串,即:子串

2-1、朴素模式匹配

时间复杂度:

子串长度为m,目标串长度为n:

  • 最好:O(m)
  • 最坏:O(n*m),(n-m+1)*m
  • 平均:O(n+m)

2-2、KMP模式匹配 

朴素模式匹配的改进。

改进之处:匹配过程,出现相比较的字符串不相等时,不需要回溯主串的指针,利用已经得到的部分匹配结果,将子串向后滑动尽可能远的距离,再继续比较。

计算子串向后滑动尽可能远的距离,就是计算next[j]的值。

  • 前缀:包含第一个字符,但不包含最后一个字符的子串。
  • 后缀:包含最后一个字符,但不包含第一个字符的子串。
  • 最长相等前后缀:前缀和后缀相等的最长子串。

例如字符串“abca”

  • 前缀:{a,ab,abc}
  • 后缀:{a,ca,bca}
  • 最长相等前后缀:a

【注意】:

子串要是连续的!

第i个字符的next值 = next[i] = 从1到 i-1串中最长相等前后缀长度+1

特殊情况:

next[1] = 0

next[2] = 1

示例:求next[5]

len = 1时,前缀a = 后缀a,√

len = 2时,前缀aa = 后缀aa,√

len = 3时,前缀aaa = 后缀aaa,√

len = 4时,不可取,因为前缀包含了最后一个字符,后缀包含了第一个字符

所以,一共可取的最大len = 3,所以next[5] = 3+1 = 4。

KMP模式匹配的简单了解

当发生不匹配时,j回退,但是i不回退了,i会一直前进!!!

具体j回退到哪一位,就用next[j]求值。 

因为,next[j] = next[5] = 4,所以,j回退到第四位。

好处,前j位和主串是匹配的。 

2-3、真题

真题1:

真题2:

真题3:

真题4:

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐