目录
前言
A.建议
1.学习算法最重要的是理解算法的每一步,而不是记住算法。
2.建议读者学习算法的时候,自己手动一步一步地运行算法。
B.简介
Z-Algorithm(也称Z-Score算法)是一种在线性时间内计算给定字符串的所有后缀与其自身最长公共前缀长度的高效算法。
一 代码实现
算法原理: Z-Algorithm的主要思想是在遍历输入字符串的同时,维护一个长度为n
的数组Z
,其中Z[i]
表示字符串从索引i
开始的后缀与原字符串的最长公共前缀长度。算法通过利用已经计算过的子问题结果来避免重复工作,从而达到线性时间复杂度。
// 定义Z数组
int Z[n];
// 初始化边界条件
Z[0] = n; // 当前字符的单个字符作为其自己的最长公共前缀
if (n > 1 && S[0] == S[1]) {
Z[1] = 2;
} else {
Z[1] = 0;
}
// L 和 R 分别代表当前活跃的Z-box的左边界和右边界
int L = 0, R = 0;
// 遍历字符串,计算每个位置的Z值
for (int i = 2; i < n; ++i) {
if (i <= R) { // 利用已知的Z值加速计算
Z[i] = min(R - i + 1, Z[i - L]);
}
while (i + Z[i] < n && S[Z[i]] == S[i + Z[i]]) { // 扩展Z[i]
Z[i]++;
}
if (i + Z[i] - 1 > R) { // 更新活跃的Z-box边界
L = i;
R = i + Z[i] - 1;
}
}
以上代码给出了Z-Algorithm的基本框架,下面是一个更完整的C语言实现示例:
#include <stdio.h>
#include <string.h>
void computeZArray(char *S, int Z[], int n) {
Z[0] = n;
if (n > 1) {
Z[1] = (S[0] == S[1]) ? 2 : 0;
}