返回

LeetCode每日一题|187. 重复的DNA序列之深度解析

前端

题目

给定一个字符串 s,返回所有长度为 10重复 子串。

例如,如果 s = "AAAAACCCCCAAAAACCCCC", 那么你应该返回:"AAAAACCCCC"

解决思路

本题的本质是查找字符串中的重复子串。我们可以使用哈希表来解决这个问题。

首先,我们将字符串 s 分割成长度为 10 的子串,并将这些子串存储在一个哈希表中。

然后,我们遍历字符串 s,对于每一个长度为 10 的子串,我们检查它是否已经在哈希表中。

如果它已经在哈希表中,那么它就是一个重复的子串,我们将其添加到结果列表中。

否则,我们将它添加到哈希表中。

最后,我们将结果列表返回。

实现方法

def findRepeatedDnaSequences(s):
    """
    :type s: str
    :rtype: List[str]
    """
    # 创建一个哈希表来存储长度为 10 的子串
    hash_table = set()

    # 创建一个结果列表来存储重复的子串
    result = []

    # 将字符串 s 分割成长度为 10 的子串
    for i in range(len(s) - 9):
        sub_string = s[i:i+10]

        # 检查子串是否已经在哈希表中
        if sub_string in hash_table:
            # 如果子串已经在哈希表中,那么它就是一个重复的子串,我们将其添加到结果列表中
            result.append(sub_string)
        else:
            # 否则,我们将它添加到哈希表中
            hash_table.add(sub_string)

    return result


# 测试代码
s = "AAAAACCCCCAAAAACCCCC"
result = findRepeatedDnaSequences(s)
print(result)

代码细节

  • findRepeatedDnaSequences 函数是本题的解题函数。

  • hash_table 是一个哈希表,用来存储长度为 10 的子串。

  • result 是一个结果列表,用来存储重复的子串。

  • for 循环将字符串 s 分割成长度为 10 的子串。

  • if 语句检查子串是否已经在哈希表中。

  • if 语句内部的代码将重复的子串添加到结果列表中。

  • else 语句内部的代码将子串添加到哈希表中。

  • 最后,函数返回结果列表。

总结

通过本题,我们学习了如何使用哈希表来查找字符串中的重复子串。这种方法的时间复杂度为 O(n),空间复杂度为 O(n)