问题描述
小C正在研究一种环状的 DNA 结构,它由四种碱基A、C、G、T构成。这种环状结构的特点是可以从任何位置开始读取序列,因此一个长度为 n 的碱基序列可以有 n 种不同的表示方式。小C的任务是从这些表示中找到字典序最小的序列,即该序列的“最小表示”。
例如:碱基序列 ATCA 从不同位置读取可能的表示有 ATCA, TCAA, CAAT, AATC,其中 AATC 是字典序最小的表示。
测试样例
样例1:
输入:
dna_sequence = "ATCA"
输出:'AATC'
样例2:
输入:
dna_sequence = "CGAGTC"
输出:'AGTCCG'
样例3:
输入:
dna_sequence = "TTGAC"
输出:'ACTTG'
解题思路
-
理解问题:我们需要找到一个环状序列的所有可能表示,并从中选择字典序最小的那个。
-
生成所有可能的表示:对于一个长度为
n的序列,我们可以通过将其复制一次(即dna_sequence + dna_sequence),然后从每个位置开始截取长度为n的子串来生成所有可能的表示。 -
比较字典序:我们可以使用 Python 的字符串比较功能来找到字典序最小的表示。
Python3代码(通过豆包Marscode测试)
def solution(dna_sequence):
n = len(dna_sequence)
# 生成所有可能的表示
possible_representations = [dna_sequence[i:] + dna_sequence[:i] for i in range(n)]
# 找到字典序最小的表示
min_representation = min(possible_representations)
return min_representation
if __name__ == "__main__":
# 你可以添加更多测试用例
print(solution("ATCA") == "AATC")
print(solution("CGAGTC") == "AGTCCG")
print(solution("TCATGGAGTGCTCCTGGAGGCTGAGTCCATCTCCAGTAG") == "AGGCTGAGTCCATCTCCAGTAGTCATGGAGTGCTCCTGG")
关键步骤解释
-
生成所有可能的表示:
possible_representations = [dna_sequence[i:] + dna_sequence[:i] for i in range(n)]这行代码通过将
dna_sequence复制一次,并从每个位置开始截取长度为n的子串,生成所有可能的表示。 -
找到字典序最小的表示:
min_representation = min(possible_representations)这行代码使用 Python 的
min函数来找到字典序最小的表示。
时间复杂度
-
生成所有可能的表示:
possible_representations = [dna_sequence[i:] + dna_sequence[:i] for i in range(n)]这一步需要遍历
dna_sequence的所有位置,并对每个位置生成一个新的字符串。生成每个字符串的时间复杂度是O(n),因此总的时间复杂度是O(n^2)。 -
找到字典序最小的表示:
min_representation = min(possible_representations)这一步需要遍历
possible_representations列表,并找到字典序最小的字符串。由于possible_representations的长度是n,因此这一步的时间复杂度是O(n)。
综合来看,生成所有可能的表示的时间复杂度是 O(n^2),找到最小表示的时间复杂度是 O(n)。因此,总的时间复杂度是 O(n^2)。
空间复杂度
-
生成所有可能的表示:
possible_representations = [dna_sequence[i:] + dna_sequence[:i] for i in range(n)]这一步生成了一个长度为
n的列表,每个元素是一个长度为n的字符串。因此,总的空间复杂度是O(n^2)。 -
其他变量: 除了
possible_representations列表外,其他变量(如n和min_representation)的空间复杂度是O(1)。
综合来看,总的空间复杂度是 O(n^2)。
总结
- 时间复杂度:
O(n^2) - 空间复杂度:
O(n^2)