环状 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`
#include <iostream>
#include <string>std::string solution(std::string dna_sequence) {int n = dna_sequence.length();std::string min_rep = dna_sequence; // 初始化最小表示为原始序列// 生成所有可能的表示法for (int i = 1; i < n; ++i) {std::string rotated = dna_sequence.substr(i) + dna_sequence.substr(0, i);if (rotated < min_rep) {min_rep = rotated; // 更新最小表示}}return min_rep;
}int main() {// 你可以在这里添加更多的测试用例std::cout << (solution("ATCA") == "AATC") << std::endl;std::cout << (solution("CGAGTC") == "AGTCCG") << std::endl;std::cout << (solution("TCATGGAGTGCTCCTGGAGGCTGAGTCCATCTCCAGTAG") == "AGGCTGAGTCCATCTCCAGTAGTCATGGAGTGCTCCTGG") << std::endl;return 0;
}
后记:报名线上字节青训,要入营需要AC多道题,但又不知道AC不AC,听说是AI判题
咯咯哒觉得AI很牛,它到底咋检测输入输出的,是只看结果True?我总以为代码改写成这样的,题目给的原代码是不是不能改啊……
#include <iostream>
#include <string>std::string minRepresentation(const std::string& dna) {std::string doubled_dna = dna + dna; // 将 DNA 序列重复一次std::string min_rep = dna; // 初始化最小表示为原始 DNAint n = dna.length();// 遍历所有可能的起始位置for (int i = 1; i < n; ++i) {std::string current_rep = doubled_dna.substr(i, n); // 获取当前表示法if (current_rep < min_rep) { // 更新最小表示min_rep = current_rep;}}return min_rep;
}int main() {std::string dna_sequence;std::cin >> dna_sequence; // 输入 DNA 序列std::cout << minRepresentation(dna_sequence) << std::endl; // 输出最小表示return 0;
}
真不放心又回报名网页里头看,是不是只支持Java和python。。。补药哇我想入营——