1

我知道有针对 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 个字符,直到匹配被破坏。然后它获取最后一个匹配位并附加到一个列表中。然后从它停止的地方重新启动。

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

4

1 回答 1

1

我不会说 python,但我认为你正在跳过可能的匹配项start=end-1。你可能需要做start=start+1.

例如,假设您有以下字符串:

GATCAA GAGCAATCAA

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

编辑:显然您还需要endstart. 您可以将其设置start+1为始终从两个字母的字符串开始查找,就像您正在做的那样,或者您可以通过从迄今为止找到的最长匹配的长度开始优化您的代码。

于 2018-01-27T11:37:41.220 回答