[leetcode] Repeated DNA Sequences

该博客讨论了一种在DNA分子中查找重复10个字母长序列的方法。通过构建字典树并利用位操作,将10个字母的DNA序列编码为32位整数,从而解决内存限制问题。博主分享了如何通过位运算找到子串的后续部分,以及如何通过无序映射存储和检查重复序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Problem Description: 

All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACGAATTCCG". When studying DNA, it is sometimes useful to identify repeated sequences within the DNA.

Write a function to find all the 10-letter-long sequences (substrings) that occur more than once in a DNA molecule.

For example,

Given s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT",

    Return: ["AAAAACCCCC", "CCCCCAAAAA"].
刚拿到这个题目时,我的想法是,在一个字符串中寻找一些子串,KMP算法能够提高在一个字符串中寻找模式串的速度,所以是否可以用KMP算法呢?直观上来看,KMP算法需要一个模式串,在上面的题目中这个模式串可以是字符串s的任意长度为10的子串。枚举这些子串,再在s中寻找其他位置上是否还出现过该子串。这种方法应该是可行的,但是还是太暴力了。

另外一个想法是字典树。构造一个字典树来存储字符串s的所有长度为10的子串,由于这里只有4个字母,10层的话大概需要2700+个结点。我自认为可以接受,没想到最后还是"Memory Limit Exceeded"。

最后,参考了discuss才明白,这里只有4个字母可以两个bit来进行编码,这样一个长度为10的基因序列字符串(20位)可以用int(32位)来表示。另外当知道子串"s1s2...s10"对应的int数值为x,求“s2s3...s11”对应的int数值y时,可以先x与“1111 1111 1111 0011 1111 1111 1111 1111”进行&运算,即去掉了s1字母,然后将x左移两位,最后加上s11对应的编码,即得到y。因此,只需要遍历一遍字符串s,就可以求出它所有的长度为10的子串对应的编码值,将这些编码值存储到一个unordermap中,当某个值出现超过一次时即为所求的字符串(遍历时是知道子串的起始位置的)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值