Как вы, наверное, знаете, в ДНК есть четыре основания - аденин ( A
), цитозин ( C
), гуанин ( G
) и тимин ( T
). Обычно A
связывается T
и C
связывается G
, образуя «ступеньки» структуры двойной спирали ДНК .
Мы определяем дополнение базы как базу, с которой она связана - то есть дополнение A
есть T
, дополнение T
есть A
, дополнение C
есть G
и дополнение G
есть C
. Мы также можем определить комплемент ДНК-строки как строку с каждым дополненным основанием, например, комплемент GATATC
is CTATAG
.
Из-за двухцепочечной структуры ДНК основания на одной цепи дополняют основания на другой цепи. Однако ДНК имеет направление, и транскрипция ДНК происходит в противоположных направлениях на двух нитях. Следовательно, молекулярные биологи часто заинтересованы в обратном дополнении цепочки ДНК - в буквальном смысле обратном дополнению цепочки.
Для того, чтобы расширить наш предыдущий пример, обратное дополнением GATATC
является в CTATAG
обратном направлении, так GATATC
. Как вы могли заметить, в этом примере обратное дополнение равно исходной строке - такую строку мы называем обратным палиндромом . *
Учитывая последовательность ДНК, можете ли вы найти самую длинную подстроку, которая является обратным палиндромом?
* Я использую термин «обратный палиндром», взятый из Розалинд , чтобы отличить его от обычного значения палиндрома.
вход
Ввод будет одной строкой, состоящей только из символов ACGT
в верхнем регистре. Вы можете написать либо функцию, либо полную программу для этой задачи.
Выход
Вы можете выбрать вывод через печать или возврат (последний вариант доступен только в случае функции).
Ваша программа должна вывести самую длинную обратную палиндромную подстроку входной строки, если существует уникальное решение. Если существует несколько решений, вы можете либо вывести одно из них, либо все (по вашему выбору). Дубликаты в порядке, если вы решите вывести их все.
На входе гарантированно найдется решение как минимум длиной 2.
Работал пример
ATGGATCCG -> GGATCC
Обратным дополнением GGATCC
является сама себе ( GGATCC --complement--> CCTAGG --reverse--> GGATCC
), так GGATCC
же как и обратный палиндром. GATC
также является обратным палиндомом, но он не самый длинный.
Контрольные примеры
AT -> AT
CGT -> CG
AGCA -> GC
GATTACA -> AT, TA
ATGGATCCG -> GGATCC
CCCCCGGGGG -> CCCCCGGGGG
ACATATATAGACT -> ATATAT, TATATA
ATTCGATCTATGTAAAGAGG -> TCGA, GATC
CGCACGTCTACGTACCTACGTAG -> CTACGTAG
TCAATGCATGCGGGTCTATATGCAT -> ATGCAT, GCATGC [, ATGCAT]
CGCTGAACTTTGCCCGTTGGTAGAACGGACTGATGTGAACGAGTGACCCG -> CG, GC, TA, AT [, GC, CG, CG, CG, CG]
CTCGCGTTTGCATAACCGTACGGGCGGAACAGTCGGCGGTGCCTCCCAGG -> CCGTACGG
счет
Это код гольф, поэтому решение в наименьшем количестве байтов выигрывает.