这道题的坑点让人很难想到,首先针对原序列分离出来的肽链如果重复出现,则结果要重复输出,但是循环肽链产生子序列如果与原序列中冲突,需要将其移除,即不进行输出。
python 源码:
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
tailian = input()
result = [0]
dicts = {'G': 57, 'A': 71, 'S': 87, 'P': 97, 'V': 99, 'T': 101, 'C': 103, 'I': 113, 'L': 113, 'N': 114, 'D': 115
, 'K': 128, 'Q': 128, 'E': 129, 'M': 131, 'H': 137, 'F': 147, 'R': 156, 'Y': 163, 'W': 186}
for i in tailian:
result.append(dicts[i])
# 生成循环肽链
xunhuan = tailian[2:]
for i in tailian[:-1]:
xunhuan += i
xunhuans = []
for j in range(2, len(tailian) + 1):
mers = kmer(tailian, j)
for k in mers.keys():
xunhuans.append(k)#保存原肽链每次分离出的子序列,供循环肽链排除使用
temp = 0
for l in k:
temp += dicts[l]
for t in range(mers[k]):
result.append(temp)
for m in range(2, len(tailian)):
merss = kmer(xunhuan, m)
for n in merss.keys():
if n in xunhuans: #如果循环肽链产生的子序列在原肽链产生的子序列中出现,则跳过
continue
else:
temps = 0
for q in n:
temps += dicts[q]
for tt in range(merss[n]):
result.append(temps)
for data in sorted(result):
print(data, end=' ')