Rosalind 032 Speeding Up Motif Finding

题目背景:

这个问题涉及到计算一个给定DNA字符串的失败数组(failure array)。失败数组是一种在字符串匹配算法(如KMP算法)中常用的工具。对于字符串s,它的失败数组P是一个数组,其中P[k]代表字符串s中从第j个字符到第k个字符的子串s[j:k](不包括第k个字符)与s的某个前缀s[1:k-j+1]完全匹配的最长长度,且这里的j不能等于1(否则P[k]总是等于k)。按照惯例,P[1]=0。

https://rosalind.info/problems/kmp/

题目条件:

给定输入:一个FASTA格式的DNA字符串‘s’

输出:字符串s的失败数组P,这个数组的每个元素P[k]表示对应位置之前的子串能够与s的最长前缀完全匹配的长度。

代码:

from method import fasta


def compute_failure_array(s):
    n = len(s)
    P = [0] * n  # 初始化失败数组

    for k in range(1, n):
        j = P[k - 1]
        while j > 0 and s[j] != s[k]:
            j = P[j - 1]
        if s[j] == s[k]:
            j += 1
        P[k] = j

    return P

name_list,value_list = fasta("D:/pycharm/Rosalind/Data/rosalind_kmp.txt")
dna_string = value_list[0]
failure_array = compute_failure_array(dna_string)
print(*failure_array) 

你可能感兴趣的:(生物信息,算法)