Z函数(扩展KMP)
Z函数(扩展KMP)
用于解决以下问题:给定一个长度为n的字符串,求出一个数组,其中表示字符串和的最长公共前缀。其中 。
假设当前已经求出了到,下一个要求:
设为到中,能匹配到的最远距离,即:,记取最大值时的值为.
可知:字符串和是相等的.
假设此时要求的,可知和是相等的。
记, 则和是相等的. 又因为和是相等的,因此我们找到了从开始的一段长为的公共前缀.下面分两种情况:
1.当时,的值即为.
2.当时,大于的部分不一定能和前面匹配上,因此应该从开始往后扩展.
算法的复杂度为,为字符串的长度.
代码
const int N = 20000005;
int n, z[N];
string s;
void Z(string &s) {
n = s.size();
int p = 0, k = 1; z[0] = n;
while(z[1] + 1 < n && (s[z[1] + 1] == s[z[1]])) z[1]++;
p = z[1]; k = 1;
for(int i = 2; i < n; i++) {
int l = z[i - k];
if(i + l - 1 <= p) {
z[i] = l;
} else {
z[i] = max(0, p - i + 1);
while(z[i] + i < n && (s[z[i] + i] == s[z[i]])) z[i]++;
}
if(z[i] > p) {
p = z[i]; k = i;
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效