Python 找到重复子串

在字符串处理过程中,我们经常需要寻找是否存在重复的子串。Python提供了多种方法来实现这个功能。本文将介绍两种常用的方法:基于哈希表和滑动窗口。

基于哈希表的方法

基于哈希表的方法是一种快速有效的解决方案。它的思想是遍历字符串,将每个子串放入哈希表中,并记录每个子串出现的次数。当一个子串出现两次或更多时,我们就找到了重复的子串。

下面是一个基于哈希表的示例代码:

def find_duplicate_substring(s):
    n = len(s)
    seen = {}
    result = []
    
    for i in range(n):
        for j in range(i+1, n+1):
            substring = s[i:j]
            if substring in seen and substring not in result:
                result.append(substring)
            seen[substring] = seen.get(substring, 0) + 1
    
    return result

在上述代码中,我们使用了两个循环来遍历所有可能的子串。对于每个子串,我们首先检查它是否已经出现过,如果是,则将它加入到结果列表中。然后,我们将子串添加到哈希表中,并记录它出现的次数。

这个方法的时间复杂度为O(n^3),其中n是字符串的长度。尽管它的时间复杂度比较高,但是对于小规模的字符串,这个方法仍然是可行的。

滑动窗口的方法

滑动窗口是一种更高效的方法,它能够在O(n)的时间复杂度内找到重复的子串。它的基本思想是维护一个滑动窗口,通过移动窗口的起始位置和结束位置来找到重复的子串。

下面是一个使用滑动窗口方法的示例代码:

def find_duplicate_substring(s):
    n = len(s)
    start = 0
    end = 0
    seen = set()
    result = []
    
    while end < n:
        if s[end] not in seen:
            seen.add(s[end])
            end += 1
        else:
            result.append(s[start:end])
            seen.remove(s[start])
            start += 1
    
    return result

在上述代码中,我们使用两个指针startend来表示滑动窗口的起始位置和结束位置。我们还使用一个集合seen来记录窗口内出现过的字符。当窗口内出现重复字符时,我们将窗口内的字符串加入到结果列表中,并将窗口的起始位置向右移动一位。

这个方法的时间复杂度是O(n),其中n是字符串的长度。通过使用滑动窗口,我们能够避免对每个子串进行比较,从而提高了算法的效率。

综上所述,我们介绍了两种常用的方法来寻找重复的子串。基于哈希表的方法适用于小规模的字符串,而滑动窗口的方法则适用于大规模的字符串。根据具体的需求和字符串的长度,我们可以选择合适的方法来解决问题。

代码示例参考自[LeetCode](

行程图

下面是使用Mermaid语法绘制的行程图,展示了基于哈希表和滑动窗口两种方法的解决过程:

journey
    title Python 找到重复子串
    section 基于哈希表的方法
        哈希表 --> 循环遍历所有子串
        循环遍历所有子串 --> 判断子串是否已经出现过
        判断子串是否已经出现过 --> 添加子串到结果列表
        添加子串到结果列表 --> 添加子串到哈希表
    section 滑动窗口的方法
        滑动窗口 --> 移动窗口的起始位置和结束位置
        移动窗口的起始位置和结束位置 --> 判断