问题描述
环状 DNA 又称超螺旋,即一段碱基序列呈现环状,在分析时,需要将相同序列的环状 DNA 分到相同组内,现需将环状碱基序列按照最小表示法进行排序。
一段长度为 n
的碱基序列,按照顺时针方向,碱基序列可以从任意位置起开始该序列顺序,因此长度为 n
的碱基序列有 n
种表示法。例如:长度为 6 的碱基序列 CGAGTC
,有 CGAGTC
、GAGTCC
、AGTCCG
等表示法。在这些表示法中,字典序最小的称为"最小表示"。
输入一个长度为 n
(n <= 100
)的环状碱基序列(只包含 A
、C
、G
、T
这 4 种碱基)的一种表示法,输出该环状碱基序列的最小表示。
例如: ATCA
的最小表示是 AATC
CGAGTC
的最小表示是 AGTCCG
输入描述
一段 DNA 碱基序列
输出描述
DNA 碱基序列的最小表示
备注 : n <= 100
DNA 由大写英文字母 A
、G
、C
、T
组成
示例 1 输入:ATCA
输出:AATC
示例 2 输入:CGAGTC
输出:AGTCCG
c
#include <iostream>
#include <string>
std::string solution(std::string dna_sequence) {
int len = dna_sequence.length();
std::string min = dna_sequence;
dna_sequence = dna_sequence + dna_sequence;
for(int i = 1; i < len; i ++){
std::string tmp = dna_sequence.substr(i, len);
if(tmp < min) min = tmp;
}
return min;
}
int main() {
// You can add more test cases here
std::cout << (solution("ATCA") == "AATC") << std::endl;
std::cout << (solution("CGAGTC") == "AGTCCG") << std::endl;
std::cout << (solution("TCATGGAGTGCTCCTGGAGGCTGAGTCCATCTCCAGTAG") == "AGGCTGAGTCCATCTCCAGTAGTCATGGAGTGCTCCTGG") << std::endl;
return 0;
}