187. 重复的DNA序列

链接

题目.

难度:

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%
的用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值