一、题目解析:环状DNA序列的最小表示法
题目描述
小C正在研究一种环状的 DNA 结构,它由四种碱基A、C、G、T构成。这种环状结构的特点是可以从任何位置开始读取序列,因此一个长度为 n 的碱基序列可以有 n 种不同的表示方式。小C的任务是从这些表示中找到字典序最小的序列,即该序列的“最小表示”。
例如:碱基序列 ATCA 从不同位置读取可能的表示有 ATCA, TCAA, CAAT, AATC,其中 AATC 是字典序最小的表示。
题目分析
这道题所给是一种环状的字符串,则当前字符串的最后一位的下一位就是字符串的开头首字母,以此来达到环状的形态。我们需要从中找到所有不同序列表示方式中字典序最小的表示方法,即依次比较两个序列相同位置的字符,直到第一组不相同的位置,然后比较当前位置字符的大小,当前位置字符小的所在的序列的字典序更小。 比如:AAAA和AABA,当各自比较到第三个字符时,'A'<'B',则AAAA的字典序更小。
算法分析
我们需要用到string类型的substr()函数,substr()函数可以用来截取string字符串的一段,substr()函数有两个默认参数,第一个参数为截取的起始位置的下标,第二个为截取位置的结束下标(注意:substr()截取为左闭右开),第二个参数默认为npos,代表一直到字符串的最后面。substr(i)代表从下标为i的位置开始截取后面所有的字符,substr(0,i)代表从下标为0的位置一直截取到下标为i的位置(不包括下标为i的位置的字符)。
代码实现
std::string solution(std::string dna_sequence) {
string minstr=dna_sequence;
for(int i=0;i<dna_sequence.size();i++)
{
string backnode=dna_sequence.substr(0,i);
string frontnode=dna_sequence.substr(i);
string m=frontnode+backnode;
if(m<minstr)
{
minstr=m;
}
}
return minstr;
}
代码详解
首先定义一个string类型的变量minstr用来存储字典序最小的序列,使用for循环来依次改变下标,找到每一组字典序,使用两次substr()函数来截取下标为i的字符前面部分和后半部分,然后相加来获得对应的序列,使用一个临时string变量m来进行保存。(string类型对+号进行了重载,可以直接相加) string类型对<号进行了重载,可以直接比较大小,对m和minstr进行比较,将小的赋值给minstr。 当循环结束,返回minstr。
二、知识总结
这道题考察的对于string类型的熟悉程度。 使用size()获得string类型的长度 使用substr()来截取string类型的一段数据 string类型对<,+,=,>等都有重载