rosalind练习题二十六

# Perfect Matchings and RNA Secondary Structures
# Problem
# Figure 5. A perfect matching on the basepair edges is highlighted in red and represents a candidate secondary structure for the RNA strand.A matching in a graph G is a collection of edges of G for which no node belongs to more than one edge in the collection. See Figure 2 for examples of matchings. If G contains an even number of nodes (say 2n), then a matching on G is perfect if it contains n edges, which is clearly the maximum possible. An example of a graph containing a perfect matching is shown in Figure 3.
# First, let Kn denote the complete graph on 2n labeled nodes, in which every node is connected to every other node with an edge, and let pn denote the total number of perfect matchings in Kn. For a given node x, there are 2n−1 ways to join x to the other nodes in the graph, after which point we must form a perfect matching on the remaining 2n−2 nodes. This reasoning provides us with the recurrence relation pn=(2n−1)⋅pn−1; using the fact that p1 is 1, this recurrence relation implies the closed equation pn=(2n−1)(2n−3)(2n−5)⋯(3)(1).
# Given an RNA string s=s1…sn, a bonding graph for s is formed as follows. First, assign each symbol of s to a node, and arrange these nodes in order around a circle, connecting them with edges called adjacency edges. Second, form all possible edges {A, U} and {C, G}, called basepair edges; we will represent basepair edges with dashed edges, as illustrated by the bonding graph in Figure 4.
# Note that a matching contained in the basepair edges will represent one possibility for base pairing interactions in s, as shown in Figure 5. For such a matching to exist, s must have the same number of occurrences of 'A' as 'U' and the same number of occurrences of 'C' as 'G'.

# Given: An RNA string s of length at most 80 bp having the same number of occurrences of 'A' as 'U' and the same number of occurrences of 'C' as 'G'.
# Return: The total possible number of perfect matchings of basepair edges in the bonding graph of s.

# Sample Dataset
# >Rosalind_23
# AGCUAGUCAU
# Sample Output
# 12

# 本题要求计算RNA序列对应的碱基配对图中,所有含有k个碱基对的完美匹配数量。其中k为RNA序列的碱基数的一半。一个完美匹配表示所有碱基都和其它一个碱基配对,而且每个碱基只能匹配一次。我们可以使用公式 pn=(2n-1)(2n-3)...(3)(1) 来计算完美匹配的数量,其中 n = k * 2。因此,本题的步骤包括:根据给定的RNA序列生成碱基配对图,计算该图中所有含有 k 个碱基对的完美匹配的数量。输出计算结果。

from math import factorial

def count_perfect_matchings(s):
    # 计算A、C、G和U在s中的出现次数
    counts = {'A': 0, 'C': 0, 'G': 0, 'U': 0}
    for nucleotide in s:
        counts[nucleotide] += 1
        print(counts)

    # 检查A的数量等于U的数量,C的数量等于G的数量
    if counts['A'] != counts['U'] or counts['C'] != counts['G']:
        return 0

    # 计算完美匹配的总数
    n = counts['A']
    return factorial(n) * factorial(n - 1)

s = "AGCUAGUCAU"
print(count_perfect_matchings(s))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值