🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
所属专题:[字符串算法](README.md)   ## 问题 **输入:** 两条DNA序列`$ s $`与`$ t $`,每条序列长度均不超过1 kb. **输出:** 在序列`$ s $`中所有基序`$ t $`的左端位置。最左端的位置从1开始计算。 **样例数据:** ~~~ GATATATGCATATACTT ATAT ~~~ **样例输出:** ~~~ 2 4 10 ~~~   ## 背景知识 该问题涉及“基序(motif)”的概念。简单来说,基序是一段短的特定的DNA/RNA/蛋白质序列。不同物种、不同来源的序列如果共享了某一段基序,表明该共享片段可能具有一定的结构或功能特性,或存在一定的保守性。基序,乃至蛋白质高级结构中的“结构域”,是分子生物学中的重要研究对象。详情请查阅ROSALIND网站上[关于该问题的背景说明](http://rosalind.info/problems/subs/)。   ## 解答 ``` def find_motif(s, t): """在序列s中找出基序t的所有起始位置(左端从1开始计数)""" pos = [] for i in range(len(s)-len(t)+1): if s[i:i+len(t)]==t: pos.append(str(i+1)) if len(pos)==0: pos.append(str(-1)) return pos ## --main-- with open("rosalind_subs.txt", 'r') as f1: s = f1.readline().strip() t = f1.readline().strip() motif_pos = find_motif(s, t) with open("rosalind_subs_out.txt", 'w') as f2: f2.write(' '.join(motif_pos)) ```