Rosalind第33题——ros_bio33_CAT

如果第一次阅读,请查看写在前面

# 本题题目与思路不太清楚,参考作者:未琢 https://www.bilibili.com/read/cv4443961 出处:bilibili

memorize = {'': 1}  # 建立一个字典,存储已经出现过的字符串及不交叉完美匹配的数量


def ismatch(c1, c2):
    """判断是否碱基配对的函数"""
    if (c1 == 'A' and c2 == 'U') or (c1 == 'U' and c2 == 'A') or (c1 == 'G' and c2 == 'C') or (c1 == 'C' and c2 == 'G'):
        return 1
    else:
        return 0


def noncross(seq):
    """判断是否有不交叉的完美匹配"""

    if seq in memorize.keys(): # 如果这段序列之前已经被分析过了,直接取出结果即可
        return memorize[seq]

    if len(seq) % 2 == 1: # 如果这个序列长度是奇数,不可能存在完美匹配
        memorize[seq] = 0
        return 0

    if seq.count('A') != seq.count('U') or seq.count('G') != seq.count('C'): # 如果这个序列中配对的碱基数量不相同,不可能存在完美匹配
        memorize[seq] = 0
        return 0

    i = 1
    num = 0
    while i < len(seq): # 在序列中搜索所有可以与第一个碱基配对的碱基
        if ismatch(seq[0], seq[i]) == 1: # 如果第i个碱基配对
            num += (noncross(seq[1:i]) * noncross(seq[i+1:])) # 去检验被第k个碱基分出的两个序列
        i += 2 # 只需从第偶数个碱基中搜索
    memorize[seq] = num # 记录这个序列的不交叉完美匹配结果

    return num


with open('../examples/ros_bio33_CAT.txt') as f:
    title = f.readline().rstrip()
    seq = f.readline().rstrip()
result = noncross(seq)
print(result % 1000000)


'''#卡特兰数
def catalan(n):
    """返回卡特兰数的函数"""
    if n <= 1:
        return 1
    else:
        h = [1, 1]
        i = 2
        while i <= n:
            j = 0
            tmp = 0
            while j < i:
                tmp += h[j] * h[i - 1 - j]
                j += 1
            h.append(tmp)
            i += 1

        return h[n]


print(catalan(3))
'''

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值