字符串 (3)--- KMP 算法的扩展

对于个长度为n的字符串s。定义函数z[i]表示s和s[i,n-1](即以 s[i] 开头的后缀)的最长公共前缀(LCP)的长度。

z被称为s的Z函数。特别地,z[0] = 0。

如同大多数字符串主题所介绍的算法,其关键在于,运用自动机的思想寻找限制条件下的状态转移函数,

使得可以借助之前的状态来加速计算新的状态。

在该算法中,我们从1到n-1顺次计算z[i]的值(z[0]=0)。

在计算z[i]的过程中,我们会利用已经计算好的z[0],...,z[i-1]。

对于i,我们称区间[i, i+z[i]-1]是i的匹配段,也可以叫Z-box。

算法的过程中我们维护右端点最靠右的匹配段。为了方便,记作 [l, r]。

根据定义,s[l, r] 是s的前缀。在计算 z[i] 时我们保证l <= i。初始时l=r=0。

计算完前i-1个z函数,维护Z-box的[l, r], 则s[l, r] = s[0, r-l]。

在计算z[i]的过程中:

(1)如果 i <= r(在Z-box内),那么根据 [l, r] 的定义有 s[i, r] = s[i-l, r-l] 同时减l,

因此 z[i] >= min(z[i-l], r-i+1)。

这时:

若 z[i-l] < r-i+1,则 z[i] = z[i-l]。

否则 z[i-l] >= r-i+1,这时我们令 z[i] = r-i+1,

然后暴力枚举下一个字符扩展 z[i] 直到不能扩展为止。

(2)如果 i > r(在Z-box外),那么我们直接按照朴素算法,从s[i]开始比较,暴力求出z[i]。

在求出z[i]后,如果i+z[i]-1 > r,我们就需要更新[l,r],即令 l=i, r=i+z[i]-1。

当i=4时,l=4,r=5, 我们发现s[4~5]==s[0~1],z[4]==z[0],z[5]==z[1]

即如果存在s[i~r]==s[i-l~r-l], 可以直接更新z[i]=z[i-l]。

否则,逐位比较去得出i位置的z函数值

#include <iostream>

#include <vector>

using namespace std;

vector<int> z_fun(string& s)

{

int n = (int) s.length();

vector<int> z(n);

for (int i = 1, l = 0, r = 0; i < n; ++i)

{

if (i <= r)

z[i] = min (r - i + 1, z[i - l]); // r-i+1: 右端点r到i的距离

// 逐位比较,字符串下标从0开始,双指针分别指向z[i]和i+z[i]

while (i + z[i] < n && s[z[i]] == s[i + z[i]])

++z[i];

if (i + z[i] - 1 > r)

{

l = i;

r = i + z[i] - 1;

}

}

return z;

}

int main()

{

string s = "aaabaab";

vector<int> vec = z_fun(s);

return 0;

}

相关推荐
小码农<^_^>18 分钟前
优选算法精品课--滑动窗口算法(一)
算法
羊小猪~~20 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
软工菜鸡1 小时前
预训练语言模型BERT——PaddleNLP中的预训练模型
大数据·人工智能·深度学习·算法·语言模型·自然语言处理·bert
南宫生1 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
AI视觉网奇1 小时前
sklearn 安装使用笔记
人工智能·算法·sklearn
JingHongB2 小时前
代码随想录算法训练营Day55 | 图论理论基础、深度优先搜索理论基础、卡玛网 98.所有可达路径、797. 所有可能的路径、广度优先搜索理论基础
算法·深度优先·图论
weixin_432702262 小时前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
小冉在学习2 小时前
day52 图论章节刷题Part04(110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长 )
算法·深度优先·图论
Repeat7152 小时前
图论基础--孤岛系列
算法·深度优先·广度优先·图论基础
小冉在学习2 小时前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论