Python|Leetcode《1044》|最长重复子串

简介: Python|Leetcode《1044》|最长重复子串

一、题目描述

题目:最长重复子串

难度:困难

描述:给你一个字符串 s ,考虑其所有 重复子串 :即,s 的连续子串,在 s 中出现 2 次或更多次。这些出现之间可能存在重叠。

返回 任意一个 可能具有最长长度的重复子串。如果 s 不含重复子串,那么答案为 “” 。


示例1

输入:s = “banana”

输出:“ana”


示例2

输入:s = “abcd”

输出:""


二、题目解析

本题看似简单,实则十分烧脑,题目中让我们找到最长的重复子串,而题目的特点就在于重叠,先让我们通过下图来了解一下重叠的含义:

image.png

根据上图所示,子字符串1使用了前三个字符,子字符串2使用了后三个字符,中间两个字符被重复使用,这种情况就称之为重叠。


了解了重叠之后解题主旨就变成了一个判断后续字符串中是否含有已知字符串的问题,只要我们能够找到所有的已知字符串,再从中找到最长的那一个就轻而易举了。


主要思路

定义左右双指针,将双指针的区域视为滑窗,最开始滑窗中只包含字符串中最左侧的元素,判断该元素在剩余的子串中时候存在,若存在则将右侧指针右移一位,使得滑窗中包含两个元素,继续判断,若仍然存在则继续执行上述操作,图示如下:

62.png

如图所示,黄色表示滑窗,绿色表示后续子串中具有和滑窗子串相同的子串,当滑动过程中匹配不到相同子串时,则将滑窗左侧右移一位移除头部元素。图示如下:

63.png

接下来我们重复上述过程并不断保留满足条件的最长子串内容即可。

注:匹配相同子串的时候通常会使用KMP算法(Python中提供的in方法就使用了该算法)


三、解题代码

解法(一)

按照解析中的方法进行代码编写如下:

class Solution:
    def longestDupSubstring(self, s: str) -> str:
        # 左指针
        left = 0
        # 右指针
        right = 1
        res = ""
        n = len(s)
        while right < n:
            # 判断后续字符串中是否含有判断字符串
            if s[left:right] in s[left + 1:]:
                if right - left > len(res):
                    res = s[left:right]
                # 字符串右侧右移一位
                right += 1
                continue
            # 字符串左侧右移
            left += 1
            if left == right:
                right += 1
        return res


相关文章
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
59 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
121 2
|
4月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
66 7
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
29 4
|
4月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
55 3
|
4月前
|
算法 Python
【Leetcode刷题Python】剑指 Offer 33. 二叉搜索树的后序遍历序列
本文提供了一种Python算法,用以判断给定整数数组是否为某二叉搜索树的后序遍历结果,通过识别根节点并递归验证左右子树的值是否满足二叉搜索树的性质。
23 3
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
40 3
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - I. 从上到下打印二叉树
本文介绍了使用Python实现从上到下打印二叉树的解决方案,采用层次遍历的方法,利用队列进行节点的访问。
35 2
|
4月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
28 1
|
4月前
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
34 1