187. 重复的DNA序列
所有 DNA 都由一系列缩写为
'A'
,'C'
,'G'
和 'T'
的核苷酸组成,例如:"ACGAATTCCG"
。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串
s
中出现次数超过一次。示例 1:
输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" 输出:["AAAAACCCCC","CCCCCAAAAA"]
示例 2:
输入:s = "AAAAAAAAAAAAA" 输出:["AAAAAAAAAA"]
提示:
0 <= s.length <= 10
5
s[i]
为'A'
、'C'
、'G'
或'T'
法1 字符串hash
思路
滑动窗口字符串hash,边走边存储已经算过的hash,且将这些存起来,
题解
class Solution: def findRepeatedDnaSequences(self, s: str) -> List[str]: BASE = 31 MOD = 10 ** 11 hashMap = collections.defaultdict(int) target_hash = 0 power = 31 ** 10 res = [] for i in range(0, len(s)): target_hash = (target_hash * BASE + ord(s[i])) % MOD # i = 9 的时候 才可以开始判断 if i < 10 - 1: continue if i >= 10: target_hash = (target_hash - ord(s[i-10])*power + MOD) % MOD if hashMap[target_hash] == 1: res.append(s[i-10+1:i+1]) hashMap[target_hash] += 1 return res