самая длинная общая подстрока python - PullRequest
0 голосов
/ 26 апреля 2020

Учитывая список из k (k≤100) строк длиной не более 1000, найдите самую длинную общую подстроку из всех строк в данном списке.

Это основано на проблеме Розалинды.


Точное описание проблемы:

Общая подстрока набора строк - это подстрока каждого члена коллекция. Мы говорим, что общая подстрока является самой длинной общей подстрокой, если не существует более длинной общей подстроки. Например, «CG» является общей подстрокой «ACGTACGT» и «AACCGTATA», но это не настолько долго, насколько это возможно; в этом случае «CGTA» является самой длинной общей подстрокой «ACGTACGT» и «AACCGTATA».

Обратите внимание, что самая длинная общая подстрока не обязательно уникальна; для простого примера, «AA» и «CC» - это самые длинные общие подстроки «AA CC» и «CCAA».

Дано: набор из k (k≤100) строк ДНК длиной не более 1 кбит / с в формате FASTA.

Возврат: самая длинная общая подстрока в коллекции. (Если существует несколько решений, вы можете вернуть любое отдельное решение.) http://rosalind.info/problems/lcsm/


Я попытался написать прямую программу для этого. Я думал, что сделал это правильно, так как он работал на всех примерах, которые я бросил, но Розалинда говорит, что мой вывод неверен. Я думал об этом уже пару дней и думаю, что устал. Я был бы признателен за вторую пару глаз, чтобы помочь определить мою ошибку.

def get_lcs(string_list):
    string0 = string_list[0]
    n0 = len(string0)
    lcs = ''
    not_common_substrings = set()
    #pick a starting/ending index of the first string to
    #pick a potential common substring
    for i in range(n0):
        if len(lcs) > len(string0[i:]):
            break
        substring = ''
        substring_in = True
        for j in range(i, n0):
            if substring_in == False:
                break
            substring = string0[i:j+1]
            if substring in not_common_substrings:
                break

            #go through all the rest of the strings
            #in the list and see if our substring is a
            #common substring. If it is, and is longer than
            #the current longest common substring,
            #replace the current lcs with our substring
            if len(substring) < len(lcs):
                continue
            for string in string_list[1:]:
                if substring not in string:
 #optional          print(f'i={i}, j={j}, substring={substring} not in string={string}, lcs={lcs}\n')
                    not_common_substrings.add(substring)
                    substring_in = False
                    break
                else:
                    continue
            if substring_in == True:
                if len(substring) > len(lcs):
                    lcs = substring

    return lcs

Я включил комментарий, который раньше использовал, чтобы увидеть, нет ли подстроки в строке в списке, а затем распечатал, где подстрока есть и к какой строке он не принадлежит.

Я пробовал на различных примерах, вот список строк из rosalind: буфер обмена со списком строк

Моя программа вернул самую длинную общую подстроку 'A', но это неверно.

Когда я раскомментирую оператор печати в коде, я получаю

i=0, j=1, substring=AC not in string=TATCGGAAGTCGTAATGGTATAAGTTCGTTATCGAAGGCC, lcs=A

i=1, j=2, substring=CG not in string=GTTATGATGAACACATTTTATTAGCAGGTTGATCTGGTGG, lcs=A

i=2, j=3, substring=GC not in string=CTAATATCGGGAGATGTCATTTACAACTATATCTCACTGT, lcs=A

i=3, j=4, substring=CT not in string=TTGATCAAAGTATTTTCAAGAATGCGGCGGTTAAGTAGCGGGGGGTCCAACGGGTATTCG, lcs=A

i=4, j=5, substring=TC not in string=CTGGGGCGCACCCAGCTGAATTACTAAATAGATAATTACTACTTGGGGCCCGTTGTTACG, lcs=A

i=6, j=7, substring=TG not in string=GCAGATCCCGTCTAGGCGGGAAATCGGTAAGCCCTCCCTCTTTTCCAAACCCGAGGCATC, lcs=A

i=7, j=8, substring=GG not in string=TGAGCTGCCCTCAGAGAATCTGAAGTAGCGTGCTGAGTCTCGCACTGTGTAGCGAGTCAG, lcs=A

i=14, j=15, substring=GT not in string=CCTACTTCGAAGACCCTTCCCGACGCTGGCGGATAAATGCGACGGGGAGAACCTCTCTAT, lcs=A

i=15, j=16, substring=TA not in string=TGTCTGTCGCAGATTGCTTGGTGCCCTGGGCCGCAACATTCGACAGCGCGCATGAGGCAT, lcs=A

i=16, j=17, substring=AA not in string=GACCGTATATGCATTTAGACGATTCTTCGGAGACGGACTTATTAGACGACTTCCATTTTG, lcs=A

i=17, j=18, substring=AT not in string=AGCTCCCTCCTCGTCTTGTTTGAACGTAAGTCAGGTCGCAAAACCTTTAAAGGTCTCCAG, lcs=A

i=18, j=19, substring=TT not in string=TGAGCTGCCCTCAGAGAATCTGAAGTAGCGTGCTGAGTCTCGCACTGTGTAGCGAGTCAG, lcs=A

i=21, j=22, substring=AG not in string=TACTGAATATCGCTCGTCGGGCACGCTACCTATATGCTGTTATCACGTTGAACGAAATTT, lcs=A

i=24, j=25, substring=CA not in string=CCTACTTCGAAGACCCTTCCCGACGCTGGCGGATAAATGCGACGGGGAGAACCTCTCTAT, lcs=A

i=36, j=37, substring=GA not in string=TCAAACCATGTACTATCTCCTTAGCCTGTGCCAAAGTCCCCCTTAAGCCGCTCATGGTGG, lcs=A

i=40, j=41, substring=CC not in string=CTAATATCGGGAGATGTCATTTACAACTATATCTCACTGT, lcs=A

, что похоже на истину ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...