题目描述[原题链接][https://leetcode-cn.com/problems/repeated-dna-sequences/]
所有 DNA 由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
编写一个函数来查找 DNA 分子中所有出现超多一次的10个字母长的序列(子串)。
示例:
1 | 输入: s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" |
算法描述
思路:字符串中只存在四个字符 A,C,G ,T,那么可以用两位的二进制(00,01,10,11)来表示这四个字符,
那么十个字符就对应二十位的二进制,可以转换成对应的二进制表示,
又由于每个字符有四种可能,那么就定义1<<20大小的isExist数组来表示所有的字符是否已存在过,
再定义1<<20大小的isAdd数组来表示所有的字符是否已经添加到结果里面。
1.定义k表示二进制18位都为1的数字,与转换的数字key与运算,可以保留对应数字的后十八位,
也就是对应9个字符,然后再加上下一个字符,就是对应的十个字符的二进制数字,
2.然后根据sExist来判断是否已经存在
若false,则将状态为置为true
若true,则根据isAdd来判断是否已经添加,若false则添加到结果中并置为true。
C++代码1
1 | class Solution { |
C++代码2
1 | class Solution { |
Java代码
1 | class Solution { |