Leetcode 187. Repeated DNA Sequences

Problem

The DNA sequence is composed of a series of nucleotides abbreviated as ‘A’, ‘C’, ‘G’, and ‘T’.

  • For example, “ACGAATTCCG” is a DNA sequence.

When studying DNA, it is useful to identify repeated sequences within the DNA.

Given a string s that represents a DNA sequence, return all the 10-letter-long sequences (substrings) that occur more than once in a DNA molecule. You may return the answer in any order.

Algorithm

Implement a trie to insert and search.

Code

class Solution:
    def findRepeatedDnaSequences(self, s: str) -> List[str]:
        # trie define
        class Trie:
            def __init__(self):
                self.root = {}
            
            def insert(self, word):
                cNode = self.root
                for c in word:
                    if not c in cNode:
                        cNode[c] = {}
                    cNode = cNode[c]
                if not 'leaf' in cNode:
                    cNode['leaf'] = 1
                else:
                    cNode['leaf'] += 1
            
            def search(self, word):
                cNode = self.root
                for c in word:
                    if not c in cNode:
                        return False
                    cNode = cNode[c]
                if not 'leaf' in cNode:
                    return False
                else:
                    return cNode['leaf'] 
            
            def output(self, root, depth):
                for c in root:
                    print(' ' * depth, c)
                    self.output(root[c], depth+1)
        
        trie = Trie()
        slen = len(s)
        for i in range(slen-9):
            ss = s[i:i+10]
            trie.insert(ss)

        dic = {}
        for i in range(slen-9):
            ss = s[i:i+10]
            if ss not in dic and trie.search(ss) > 1:
                dic[ss] = 1
        ans = []
        for word in dic:
            ans.append(word)
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值