链接
题目.
难度:
middle
解答:
因为基因序列是一定的,并且长度也是一定的,所以可以转化为整数来运行,因为只有哦四个基因,所以2bit就满足了,10个基因一共需要20个bit,在一个int的长度之内。
package main
import "fmt"
func num(b byte) uint {
switch b {
case 'A':
return 0
case 'C':
return 1
case 'G':
return 2
case 'T':
return 3
}
return 0
}
func findRepeatedDnaSequences(s string) []string {
if len(s) <= 10 {
return nil
}
result := make([]string, 0)
appearMap := make(map[uint]bool)
collectMap := make(map[uint]bool)
prev := uint(0)
for i := 0; i <= 9; i++ {
prev = (prev << 2) + num(s[i])
}
appearMap[prev] = true
for i := 10; i < len(s); i++ {
prev = (prev << 2) + num(s[i])
prev &= 0xFFFFF
if appearMap[prev] && !collectMap[prev] {
result = append(result, s[i-9:i+1])
collectMap[prev] = true
} else {
appearMap[prev] = true
}
}
return result
}
func main() {
fmt.Println(findRepeatedDnaSequences("AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"))
}
复杂度分析
time
O(n)
space
O(N)
执行结果
执行用时 :
12 ms
, 在所有 Go 提交中击败了
97.69%
的用户
内存消耗 :
6.7 MB
, 在所有 Go 提交中击败了
100.00%
的用户