Como você deve saber, no DNA existem quatro bases - adenina ( A
), citosina ( C
), guanina ( G
) e timina ( T
). Tipicamente A
ligações com T
e C
ligações com G
, formando os "degraus" da estrutura de hélice dupla de ADN .
Definimos o complemento de uma base para ser a base à qual ele se liga - ou seja, o complemento de A
é T
, o complemento de T
é A
, o complemento de C
é G
e o complemento de G
é C
. Também podemos definir o complemento de uma sequência de DNA para ser a sequência com cada base complementada, por exemplo, o complemento de GATATC
é CTATAG
.
Por causa da estrutura do DNA de fita dupla, as bases em uma fita são complementares às bases na outra fita. No entanto, o DNA tem uma direção e a transcrição do DNA ocorre em direções opostas nas duas cadeias. Portanto, os biólogos moleculares costumam se interessar pelo complemento inverso de uma cadeia de DNA - literalmente, o inverso do complemento da cadeia.
Para estender nosso exemplo anterior, o complemento inverso de GATATC
é CTATAG
para trás, então GATATC
. Como você deve ter notado, neste exemplo o complemento reverso é igual à string original - chamamos essa string de palíndromo reverso . *
Dada uma sequência de DNA, você consegue encontrar a substring mais longa que é um palíndromo reverso?
* Uso o termo "palíndromo reverso", extraído de Rosalind , para diferenciar do significado usual de palíndromo.
Entrada
A entrada será uma única sequência que consiste apenas nos caracteres ACGT
em maiúsculas. Você pode escrever uma função ou um programa completo para esse desafio.
Resultado
Você pode optar por imprimir via impressão ou retorno (a última opção está disponível apenas no caso de uma função).
Seu programa deve gerar a substring palindrômica reversa mais longa da sequência de entrada, se houver uma solução exclusiva. Se existirem várias soluções, você poderá produzir qualquer uma delas ou todas (sua escolha). As duplicatas são válidas se você optar por produzir todas elas.
A entrada é garantida para ter uma solução de pelo menos comprimento 2.
Exemplo trabalhado
ATGGATCCG -> GGATCC
O complemento reverso de GGATCC
é ele próprio ( GGATCC --complement--> CCTAGG --reverse--> GGATCC
), assim GGATCC
como um palíndromo reverso. GATC
também é um palíndromo reverso, mas não é o mais longo.
Casos de teste
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
Pontuação
Isso é código de golfe, então a solução com o menor número de bytes vence.