当前位置: 首页 > article >正文

Z函数的原理和应用:以Python为例

Z函数

在这里插入图片描述
也就是,它想找前缀和以s[i]开头的后缀的LCP

思想

在这里插入图片描述
维护一个右端点最右的z-box
结合z[i - l]的结果和朴素算法进行优化

Z函数Python模版

def sumScores(self, s: str) -> int:
    n = len(s)
    z = [0] * n
    l = r = 0 # 右端点最右的z-box
    for i in range(1, n):
        if i <= r: # 沿用之前的结果
            z[i] = min(z[i - l], r - i + 1)
        while i + z[i] < n and s[z[i]] == s[i + z[i]]: # 朴素写法
            l, r = i, i + z[i]
            z[i] += 1
    return z

例题1

在这里插入图片描述
这道题希望找到z函数中满足i为k的倍数,且z[i]可以完全匹配完从i开始的后缀的最小值

class Solution:
    def minimumTimeToInitialState(self, s: str, k: int) -> int:
        n = len(s)
        z = [0] * n
        l = r = 0 # 右端点最右的z-box
        for i in range(1, n):
            if i <= r: # 沿用之前的结果
                z[i] = min(z[i - l], r - i + 1)
            while i + z[i] < n and s[z[i]] == s[i + z[i]]: # 朴素写法
                l, r = i, i + z[i]
                z[i] += 1
            if i % k == 0 and z[i] == n - i: # 前缀和后缀完全匹配
                return i // k
        return int(ceil(n / k))

例题2

在这里插入图片描述
这道题求z函数之和,由于z函数不包括原字符串,所以要加上原字符串长度

class Solution:
    def sumScores(self, s: str) -> int:
        n = len(s)
        z = [0] * n
        l = r = 0 # 右端点最右的z-box
        for i in range(1, n):
            if i <= r: # 沿用之前的结果
                z[i] = min(z[i - l], r - i + 1)
            while i + z[i] < n and s[z[i]] == s[i + z[i]]: # 朴素写法
                l, r = i, i + z[i]
                z[i] += 1
        return sum(z) + len(s)

总结

Z函数:对于字符串s,找 s前缀 和 以s[i]开头的后缀 的LCP(最长公共前缀),用到了DP的思想(借用前面的结果)

参考文献

oi-wiki
z函数知乎高赞回答


http://www.kler.cn/a/229794.html

相关文章:

  • 计算机的错误计算(二百零七)
  • Nacos server 2.4.0 版本已知问题和 Bug 汇总
  • 百度Android面试题及参考答案 (下)
  • 51单片机 和 STM32 在硬件操作上的差异
  • Erlang语言的网络编程
  • 新兴的开源 AI Agent 智能体全景技术栈
  • 微信自动预约小程序开发指南:从小白到专家
  • HiSilicon352 android9.0 开机视频调试分析
  • Micro micro controller一览
  • window 安装 jenkins 编写脚本
  • Linux 网络:PTP 简介
  • 5-3、S曲线生成器【51单片机+L298N步进电机系列教程】
  • 解决:VSCode 连接服务器时出错:Could not establish connection to : XHR failed
  • Vivado-IP核
  • 挑战杯 python+opencv+机器学习车牌识别
  • Maven:设定项目编码
  • 全链游戏的未来趋势与Bridge Champ的创新之路
  • python进行批量搜索匹配替换文本文字的matlab操作实例
  • 【Mysql】事务的隔离级别与 MVCC
  • 【Qt学习笔记】(三)常用控件(持续更新)
  • 基于单片机的智能寻光小车设计
  • hbuiderX打包为apk后无法停止录音的解决方案
  • Hadoop:HDFS学习巩固——基础习题及编程实战
  • 力扣● 62.不同路径 ● 63. 不同路径 II
  • 《Docker极简教程》--Docker基础--基础知识(一)
  • 我用selenium开发了一个自动创建任务,解放重复性工作