环状序列的最小字典序表示法

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 结构,它由四种碱基ACGT构成。这种环状结构的特点是可以从任何位置开始读取序列,因此一个长度为 n 的碱基序列可以有 n 种不同的表示方式。小C的任务是从这些表示中找到字典序最小的序列,即该序列的“最小表示”。

例如:碱基序列 ATCA 从不同位置读取可能的表示有 ATCATCAACAATAATC,其中 AATC 是字典序最小的表示。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值