我知道罗莎琳德挑战有解决方案,但我不希望它们破坏乐趣。我以为我找到了一个解决方案"寻找共享主题"但我的答案一直都是错的。
问题在于找到给定表格中最长的公共子字符串,该字符串由以">"开头的行组成。和下一行直到另一行以">"开头正在组成一个序列。这是它的样子:
>Rosalind_1
GATTACA
>Rosalind_2
TAGACCA
>Rosalind_3
ATACA
有一百个dna片段,你要找到最长的共同子序列。这是我的方法:
rosa = open("rosalind_lcsm.txt","r")
oku = rosa.readlines()
strs=[]
for line in oku:
if line.startswith(">"):
strs.append("kiko")
else:
strs.append(line)
rosa.close()
strs = strs[1:]
joint = "".join(strs)
joint_s = joint.split("kiko")
theOne = joint_s[0]
rest = joint_s[1:]
start=0
end=1
matches=[]
while end < len(theOne):
end+=1
while all(theOne[start:end] in seq for seq in rest):
end+=1
else:
matches.append(theOne[start:end-1])
end+=1
start=end-1
print(max(matches, key=len))
我的策略是;读取文件,将其拆分为序列,选择第一个序列并将其公共部分与其余部分进行比较。我正在检查最少2个匹配,因为序列是由ATGC组成的,肯定会发生1个匹配。它从一个角色开始,并继续扩展1个字符,直到匹配被打破。然后它采用最后一个匹配位并附加到列表中。然后从停止的地方重新开始。
我的解决方案给出了答案,但它不是正确的,我无法发现代码中的误导性部分。有人可以尝试理解我的方法并给我一个修复它的建议吗?
答案 0 :(得分:1)
我不会说python,但我认为你是通过start=end-1
跳过可能的匹配。您可能需要start=start+1
。
例如,假设你有这些字符串:
GATCAA GAGCAATCAA
您的算法将首先将GA作为公共子字符串,然后从第三个字符继续查找。但是那样你就错过了真正最长的常见子串ATCAA。
编辑:显然,您还需要与end
一起重新初始化start
。您可以将其设置为start+1
以始终从您正在执行的双字母字符串开始查找,或者您可以从目前为止找到的最长匹配的长度开始优化代码。