ご存知かもしれませんが、DNAには4つの塩基があります—アデニン(A
)、シトシン(C
)、グアニン(G
)およびチミン(T
)。通常A
、T
とC
結合しG
、と結合して、DNA二重らせん構造の「ラング」を形成します。
塩基の補数を、結合する塩基と定義します。つまり、A
is T
の補数、T
is A
の補数、C
is G
の補数、G
is の補数ですC
。また、DNA文字列の補数を、各塩基が補われた文字列、たとえばGATATC
is の補数として定義することもできますCTATAG
。
DNAの二本鎖構造のため、一方の鎖の塩基はもう一方の鎖の塩基と相補的です。しかし、DNAには方向があり、DNA転写は2本の鎖で反対方向に起こります。そのため、分子生物学者はDNAストリングの逆相補性に興味を持っていることがよくあります。文字列の相補性の逆です。
前の例を拡張するために、の逆の補数GATATC
はCTATAG
後方GATATC
です。お気づきかもしれませんが、この例では、逆の補数は元の文字列と同じです。このような文字列を逆回文と呼びます。*
DNAの文字列が与えられた場合、逆パリンドロームである最も長い部分文字列を見つけることができますか?
*私は、パリンドロームの通常の意味と区別するために、ロザリンドから取られた「逆パリンドローム」という用語を使用します。
入力
入力はACGT
、大文字の文字のみで構成される単一の文字列になります。このチャレンジのために、関数または完全なプログラムを作成できます。
出力
印刷または戻ることで出力することを選択できます(後者の選択は、関数の場合にのみ使用可能です)。
一意の解決策がある場合、プログラムは入力文字列の最長の逆パリンドローム部分文字列を出力する必要があります。複数のソリューションが存在する場合、それらのいずれか1つを出力することも、すべてを選択することもできます(選択)。すべてを出力することを選択した場合、複製は問題ありません。
入力には、少なくとも長さ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
得点
これはコードゴルフであるため、最小バイトのソリューションが勝ちます。