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

Leetcode 3303. Find the Occurrence of First Almost Equal Substring

  • Leetcode 3303. Find the Occurrence of First Almost Equal Substring
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3303. Find the Occurrence of First Almost Equal Substring

1. 解题思路

这道题的话思路上和上一题相仿,由于都是只能调整至多一个位置,因此,我们就是考察每一个位置前后最大的前序公共子序列以及后续的最大公共子序列的长度。

假设目标字符串word2的长度为 m m m,若某个位置与word2的最长公共前序数组的长度为 k k k

  • k ≥ m k\geq m km,那么该位置直接就是我们的一个答案
  • k < m k<m k<m,且从该位置开始的第 k + 2 k+2 k+2到第 m m m的恰好与word2的后 m − k − 1 m-k-1 mk1个字符相一致,那么通过调整第 k k k个字符,同样可以得到word2

由此,我们通过构造正向和负向的最大公共子串长度即可快速地求得任意一个位置是否满足条件,然后我们从中找到第一个符合题意的位置即可。

而对于任意方向的最大公共子串长度的计算方法,我们可以通过z算法进行实现,对应的内容网上有不少,我也写过一篇博客(经典算法:Z算法(z algorithm))对其进行简单介绍,这里就不过多展开了。

2. 代码实现

给出python代码实现如下:

def z_algorithm(s):
    n = len(s)
    z = [0 for _ in range(n)]
    l, r = -1, -1
    for i in range(1, n):
        if i > r:
            l, r = i, i
            while r < n and s[r-l] == s[r]:
                r += 1
            z[i] = r-l
            r -= 1
        else:
            k = i - l
            if z[k] < r - i + 1:
                z[i] = z[k]
            else:
                l = i
                while r < n and s[r-l] == s[r]:
                    r += 1
                z[i] = r-l
                r -= 1
    z[0] = n
    return z

class Solution:
    def minStartingIndex(self, s: str, pattern: str) -> int:
        n, m = len(s), len(pattern)
        z1 = z_algorithm(pattern + s)
        z2 = z_algorithm(pattern[::-1] + s[::-1])
        for i in range(n):
            if i+m > n:
                break
            c1 = z1[i+m]
            if c1 >= m:
                return i
            j = i+m-1
            c2 = z2[n-j-1+m]
            if c1 + c2 == m-1:
                return i
        return -1

提交代码评测得到:耗时2756ms,占用内存50.4MB。


http://www.kler.cn/news/327562.html

相关文章:

  • 【分布式微服务云原生】 RPC协议:超越HTTP的远程通信艺术
  • 基于Springboot+Vue的c语言学习辅导网站的设计与实现 (含源码数据库)
  • 中间件:SpringBoot集成Redis
  • 【Python|接口自动化测试】使用requests库发送HTTP请求
  • Django连接Azure服务器里的gpt-4o并实现聊天功能
  • PHP程序如何实现限制一台电脑登录?
  • maven parent: 指定了项目的父 POM packaging: 指定打包类型为 POM。 modules: 列出了该项目包含的子模块,
  • 【开源免费】基于SpringBoot+Vue.JS校园资料分享平台(JAVA毕业设计)
  • opus基础简介(github)
  • 使用rsync+jenkins实现服务自动部署全流程
  • React 生命周期 - useEffect 介绍
  • WebGIS包括哪些技术栈?怎么学习?
  • 足球青训俱乐部后台:Spring Boot开发策略
  • 滚雪球学MySQL[11.1讲]:总结与展望
  • Spring Boot 点餐系统:简化您的订餐流程
  • 一个服务器可以搭建几个网站
  • vue结合element-ui实现列表拖拽变化位置,点击拖动图标拖动整个列表元素,使用tsx格式编写
  • SpringBootTest Mockito 虚实结合编写测试
  • LPDDR4芯片学习(二)——Functional Description
  • 解锁高效开发的秘密武器
  • <Rust>egui学习之部件(十三):如何为文本添加链接Link和超链接HyperLink功能?
  • 基于J2EE技术的高校社团综合服务系统
  • 设计模式---代理模式
  • webpack使用
  • 【Spring Boot 入门一】构建你的第一个Spring Boot应用
  • ECMAScript 详解
  • 新版本Android Studio如何新建Java code工程
  • MATLAB中数据导入与导出的全面指南
  • Ionic 颜色:探索前端开发的调色板
  • Spring Boot实现足球青训俱乐部管理自动化