返回
LeetCode每日一题|187. 重复的DNA序列之深度解析
前端
2023-12-11 17:10:53
题目
给定一个字符串 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)
。