Như bạn có thể biết, trong DNA có bốn bazơ - adenine ( A
), cytosine ( C
), guanine ( G
) và thymine ( T
). Thông thường A
liên kết với T
và C
liên kết với G
, tạo thành "nấc thang" của cấu trúc xoắn kép DNA .
Chúng tôi định nghĩa phần bù của một cơ sở là cơ sở mà nó liên kết với - tức là phần bù của A
là T
, phần bù của T
là A
, phần bù của C
là G
và phần bù của G
là C
. Chúng ta cũng có thể định nghĩa phần bù của chuỗi DNA là chuỗi có mỗi cơ sở được bổ sung, ví dụ phần bù GATATC
là CTATAG
.
Do cấu trúc sợi kép của DNA, các bazơ trên một sợi này bổ sung cho các bazơ trên chuỗi kia. Tuy nhiên DNA có một hướng và phiên mã DNA xảy ra theo hai hướng ngược nhau trên hai sợi. Do đó, các nhà sinh học phân tử thường quan tâm đến phần bù ngược của chuỗi DNA - hoàn toàn theo nghĩa đen của phần bổ sung của chuỗi.
Để mở rộng ví dụ trước của chúng tôi, bổ sung ngược GATATC
là CTATAG
ngược, vì vậy GATATC
. Như bạn có thể nhận thấy, trong ví dụ này, phần bù ngược bằng với chuỗi gốc - chúng tôi gọi một chuỗi như vậy là một bảng màu ngược . *
Đưa ra một chuỗi DNA, bạn có thể tìm thấy chuỗi con dài nhất là một palindrom ngược không?
* Tôi sử dụng thuật ngữ "palindrom ngược", được lấy từ Rosalind , để phân biệt với ý nghĩa thông thường của palindrom.
Đầu vào
Đầu vào sẽ là một chuỗi duy nhất chỉ bao gồm các ký tự ACGT
in hoa. Bạn có thể viết một chức năng hoặc một chương trình đầy đủ cho thử thách này.
Đầu ra
Bạn có thể chọn xuất thông qua in hoặc trả lại (lựa chọn sau chỉ khả dụng trong trường hợp chức năng).
Chương trình của bạn sẽ xuất ra chuỗi con palindromic ngược dài nhất của chuỗi đầu vào, nếu có một giải pháp duy nhất. Nếu có nhiều giải pháp tồn tại, thì bạn có thể xuất bất kỳ một trong số chúng, hoặc tất cả chúng (lựa chọn của bạn). Các bản sao đều ổn nếu bạn chọn xuất tất cả chúng.
Đầu vào được đảm bảo có giải pháp ít nhất là chiều dài 2.
Ví dụ làm việc
ATGGATCCG -> GGATCC
Phần bù ngược của GGATCC
chính nó ( GGATCC --complement--> CCTAGG --reverse--> GGATCC
), do đó GGATCC
là một bảng màu ngược. GATC
cũng là một palindome ngược, nhưng nó không phải là dài nhất.
Các trường hợp thử nghiệm
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
Chấm điểm
Đây là mã golf, vì vậy giải pháp trong ít byte nhất sẽ thắng.