问题描述
环状 DNA 又称超螺旋,即一段碱基序列呈现环状,在分析时,需要将相同序列的环状 DNA 分到相同组内,现需将环状碱基序列按照最小表示法进行排序。
一段长度为 n 的碱基序列,按照顺时针方向,碱基序列可以从任意位置起开始该序列顺序,因此长度为 n 的碱基序列有 n 种表示法。例如:长度为 6 的碱基序列 CGAGTC,有 CGAGTC、GAGTCC、AGTCCG 等表示法。在这些表示法中,字典序最小的称为“最小表示”。
输入一个长度为 n(n <= 100)的环状碱基序列(只包含 A、C、G、T 这 4 种碱基)的一种表示法,输出该环状碱基序列的最小表示。
例如:
ATCA 的最小表示是 AATC
CGAGTC 的最小表示是 AGTCCG
思路
求环的问题,直接复制一段字符串拼接到原字符串后面,然后限定长度扫描长度和次数,不断比较出字典序较小的字符串
代码实现
package main
import "fmt"
func solution(dna_sequence string) string {
// Please write your code here
double_dna := dna_sequence + dna_sequence
length := len(dna_sequence)
minDna := dna_sequence
for i := 1; i < length; i++ {
substring := double_dna[i : i+length]
if substring < minDna {
minDna = substring
}
}
return minDna
}
func main() {
// You can add more test cases here
fmt.Println(solution("ATCA") == "AATC")
fmt.Println(solution("CGAGTC") == "AGTCCG")
fmt.Println(solution("TCATGGAGTGCTCCTGGAGGCTGAGTCCATCTCCAGTAG") == "AGGCTGAGTCCATCTCCAGTAGTCATGGAGTGCTCCTGG")
}