环状DNA序列整理(golang)

146 阅读1分钟

问题描述

环状 DNA 又称超螺旋,即一段碱基序列呈现环状,在分析时,需要将相同序列的环状 DNA 分到相同组内,现需将环状碱基序列按照最小表示法进行排序。

一段长度为 n 的碱基序列,按照顺时针方向,碱基序列可以从任意位置起开始该序列顺序,因此长度为 n 的碱基序列有 n 种表示法。例如:长度为 6 的碱基序列 CGAGTC,有 CGAGTCGAGTCCAGTCCG 等表示法。在这些表示法中,字典序最小的称为“最小表示”。

输入一个长度为 nn <= 100)的环状碱基序列(只包含 ACGT 这 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")
}