rosalind解决方案:共享图案

时间:2018-01-25 12:03:13

标签: python longest-substring rosalind

我知道罗莎琳德挑战有解决方案,但我不希望它们破坏乐趣。我以为我找到了一个解决方案"寻找共享主题"但我的答案一直都是错的。

问题在于找到给定表格中最长的公共子字符串,该字符串由以">"开头的行组成。和下一行直到另一行以">"开头正在组成一个序列。这是它的样子:

>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个字符,直到匹配被打破。然后它采用最后一个匹配位并附加到列表中。然后从停止的地方重新开始。

我的解决方案给出了答案,但它不是正确的,我无法发现代码中的误导性部分。有人可以尝试理解我的方法并给我一个修复它的建议吗?

1 个答案:

答案 0 :(得分:1)

我不会说python,但我认为你是通过start=end-1跳过可能的匹配。您可能需要start=start+1

例如,假设你有这些字符串:

GATCAA GAGCAATCAA

您的算法将首先将GA作为公共子字符串,然后从第三个字符继续查找。但是那样你就错过了真正最长的常见子串ATCAA。

编辑:显然,您还需要与end一起重新初始化start。您可以将其设置为start+1以始终从您正在执行的双字母字符串开始查找,或者您可以从目前为止找到的最长匹配的长度开始优化代码。