您可能知道,DNA中有四个碱基-腺嘌呤(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转录在两条链上以相反的方向发生。因此,分子生物学家通常对DNA字符串的反向补体感兴趣-实际上是字符串的反向补体的反义。
为了扩展前面的示例,的反向补码GATATC
是CTATAG
向后的,因此GATATC
。您可能已经注意到,在此示例中,反向补码等于原始字符串-我们称此类字符串为反向回文。*
给定一串DNA,您能找到最长的反回文子串吗?
*我使用“反向回文”(Rosalind)一词来区别回文的通常含义。
输入值
输入将是仅包含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
计分
这是代码高尔夫,因此以最少的字节数获胜的解决方案。