187. 重复的DNA序列

方法一:
	本来想要使用前缀和的方法,将ACGT与数字进行映射
	然后不断向右移动,因长度固定为10,则可得和相同即为相同子序列

	痛点:
		AAAAACCCCC==CCCCCAAAAA
		但其不为相同子序列
		AAAAACCCCCGCCCCCAAAAA(经过了fun2()检验)
def fun1(s):
    dic={"A":1,"C":2,"G":3,"T":4}  #因为长度固定???,不对这样不对,因为内部是打乱的
    pass



使用滑动窗口+哈希表的方法
	对于每个字符串,进入哈希表判断一下
	又因为res(结果)中不可以出现重复字符串,所以再使用panduan哈希表
	进行问题查找
def fun2(s):
    if len(s) < 10:
        return []
    select = set()  # 因不记录次数,所以只要>=2就可以count
    # count=0
    cur = ""
    res = []
    panduan = set()
    for i in range(10):
        cur += s[i]
    select.add(cur)
    for i in range(10, len(s)):
        cur = cur[1::] + s[i]
        if cur in select:
            # count+=1
            if cur not in panduan:
                res.append(cur)
                panduan.add(cur)
        else:
            select.add(cur)
    return res

更加方便的写法,优化了添加思路
def fun3(s):
    if len(s) < 10:
        return []
    select = {}
    # count=0
    cur = ""
    res = []
    for i in range(10):
        cur += s[i]
    select[cur]=1
    for i in range(10, len(s)):
        cur = cur[1::] + s[i]
        select[cur]=select.get(cur,0)+1
        if select[cur]==2:  #这样只会添加第一次
            res.append(cur)
    return res
哈希函数+前缀和
	①该代码并未通过测试用例
	②改代码适用于更加复杂的情况,即子字符串的大小不限制
	③该代码的核心思路是对于每一个字符串创造一个唯一值
		3.1创造方式
		h[i]=h[i-1]*P+ord(s)
		p[i]=p[i-1]*P  p[0]=1
		可得j到i范围 h[j]-h[i-1]*p[j-i+1]
def fun4(s):
    n = len(s)
    P = 131  # 用于获取唯一哈希值
    h = [0 for i in range(n + 1)]  # 用于获取唯一哈希值
    p = [0 for i in range(n + 1)]  # 用于获取唯一哈希值
    ans = []  # 创建一个列表
    p[0] = 1  # 方便初始化,这里后面需要乘P
    for i in range(1, n + 1):
        h[i] = h[i - 1] * P + ord(s[i - 1])
        p[i] = p[i - 1] * P
    map = {}
    i = 1
    while i + 10 - 1 <= n:
        j = i + 10 - 1
        hash = h[j] - h[i - 1] * p[j - i + 1]
        cnt = map.get(hash, 0)  # 字符串
        if cnt == 1:  # 说明已经有过了
            ans.append(s[i - 1:i + 10 - 1])
        map[hash] = cnt + 1
        i += 1
    return ans

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值