""" DNA序列 DNA序列由一系列核苷酸组成,分别是为A(腺嘌呤)、T(胸腺嘧啶)、C(胞嘧啶)、G(鸟粪嘌呤) 例如,AATCCGCTAG是一个DNA序列。 在研究DNA时,识别DNA中的重复序列非常有用, 给定一个表示DNA序列的字符串, 返回所有在字符串中出现不止一次的长度为10的序列(子字符串) """ from collections import defaultdict def dna_analysis(s): """ 分析DNA序列,寻找重复的k-mer子串。 :param s: 输入的DNA序列字符串 :return: 所有重复出现两次的长度为k的子串列表,其中k为预定义的标准长度 """ # 定义标准k-mer长度 standard = 10 # 构建字符到整数的映射,用于将字符转换为二进制表示 ht_char = {"A":0,"C":1,"G":2,"T":3} # 初始化结果列表,用于存储找到的重复k-mer子串 result = [] # 获取输入序列的长度 length = len(s) # 如果输入序列长度小于等于标准k-mer长度,则直接返回空结果 if length <= standard: return result # 初始化用于存储当前k-mer的二进制表示的变量 x = 0 # 构建第一个k-mer的二进制表示 for char in s[:standard -1]: x = (x << 2) | ht_char[char] # 使用哈希表记录每个k-mer出现的次数 ht_count = defaultdict(int) # 遍历输入序列,寻找重复的k-mer for i in range(length - standard + 1): # 更新当前k-mer的二进制表示,将新的字符加入,旧的字符移除 x = ((x << 2) | ht_char[s[i + standard - 1]]) & ((1 << (standard *2)) -1) # 记录当前k-mer出现的次数 ht_count[x] += 1 # 如果当前k-mer出现次数达到2次,则将其添加到结果列表 if ht_count[x] ==2: result.append(s[i:i+standard]) # 返回结果列表 return result print(dna_analysis("AAAGTCTGACAAAGTCTGACACAAAGTCTGTT"))
评论前必须登录!
注册