对于这道题的解法 和上一道题是类似的,只要先找出指定大小的kmer,然后判断满足汉明距离小于d而且其反响互补链的汉明距离也要小于d,满足这两个条件这两个链的相似kmer之和最多的链,结果肯定是成对出现的,
python代码:
def hanming(a, b):
ham = 0
for i in range(len(a)):
if a[i] != b[i]:
ham += 1
return ham
def kmer(s,k):
mer={}
for i in range(len(s)-k+1):
if s[i:i+k] not in mer.keys():
mer[s[i:i+k]]=1
else:
mer[s[i:i+k]]+=1
return mer
def reverse(ds):
ds1=''
for i in ds:
if i=='A':
ds1+='T'
elif i=='C':
ds1+='G'
elif i=='G':
ds1+='C'
else:
ds1+='A'
return ds1[::-1]
import itertools
dna = input()
k_h = list(map(int,input().split()))
k=k_h[0]
h=k_h[1]
result={}
dnas = [''.join(x) for x in itertools.product('ACGT', repeat=k)] #使用itertools迭代器产生所有kmer
for km in dnas:
result[km]=0
for key in kmer(dna,k).keys():
r_km=reverse(km)
if hanming(km,key)<=h:
result[km]+=kmer(dna,k)[key]
if hanming(r_km, key) <= h: #判断其反转是否也符号要求,如果是,就加上的value
result[km]+=kmer(dna,k)[key]
max_=max(result.values())
for key,value in result.items():
if result[key]==max_:
print(key,end=" ")