def solution(dna_sequence):
# Please write your code here
def booth(s):
s = s + s # Concatenate string to itself
n = len(s)
f = [-1] * n # Failure function
k = 0 # Least rotation of string found so far
for j in range(1, n):
sj = s[j]
i = f[j - k - 1]
while i != -1 and sj != s[k + i + 1]:
if sj < s[k + i + 1]:
k = j - i - 1
i = f[i]
if sj != s[k + i + 1]: # Mismatch after i matches
if sj < s[k]: # Found a smaller rotation
k = j
f[j - k] = -1
else:
f[j - k] = i + 1
return s[k:k + len(s) // 2]
return booth(dna_sequence)
if __name__ == "__main__":
# You can add more test cases here
print(solution("ATCA") == "AATC")
print(solution("CGAGTC") == "AGTCCG")
print(solution("TCATGGAGTGCTCCTGGAGGCTGAGTCCATCTCCAGTAG") == "AGGCTGAGTCCATCTCCAGTAGTCATGGAGTGCTCCTGG")
很巧妙的思路。看半天没懂怎么实现的。。对KMP算法也是一知半解。。不过问题本身没这么复杂
问题描述
小C正在研究一种环状的 DNA 结构,它由四种碱基A
、C
、G
、T
构成。这种环状结构的特点是可以从任何位置开始读取序列,因此一个长度为 n
的碱基序列可以有 n
种不同的表示方式。小C的任务是从这些表示中找到字典序最小的序列,即该序列的“最小表示”。
例如:碱基序列 ATCA
从不同位置读取可能的表示有 ATCA
, TCAA
, CAAT
, AATC
,其中 AATC
是字典序最小的表示。