【读者来稿】在一串长序列中查找特定短序列

简介: 【读者来稿】在一串长序列中查找特定短序列

问题:在一串序列中,提取某些特定序列的位置

样例:在一串序列CAGTCATGCATCGTAGTC中找出所有的短序列CAG的位置

样例输出:{'CAG': [0]}

代码实现

from typing import Dict, List
def get_target_seq_position(sequence, target_sequence):
    """ 获取target_sequence在sequence中的位置 """
    # 结果
    result: Dict[str, List] = {}
    # 序列长度
    slen = len(sequence)
    for target in target_sequence:
        # 首先初始化target的结果
        # 方便后面将sequence中所有和target匹配的位置都保存下来
        result[target] = []
        # target长度
        tlen = len(target)
        # 当前匹配到的位置
        offset = 0
        # 最大的匹配位置
        max_offset = slen - tlen + 1
        for index in range(max_offset):
            # 如果 当前匹配位置为最大匹配位置
            # 就结束循环
            if offset == max_offset:
                break
            # 开始匹配
            if sequence[index:index+tlen] == target:
                # 匹配上了以后
                # 这里就直接跳到下一个可能的匹配位置
                offset += tlen
                # 保存当前匹配的位置
                result[target].append(index)
            else:
                # 没有匹配上就往后挪一位
                offset += 1
    return result

代码测试

if __name__ == '__main__':
    # 初始序列
    # 下面是字符串的换行写法
    sequence = (
        'CAGTCATGCATCGTAGTC'
        'ATCTACTATCTAGCATCT'
        'AGCTATCTAGCTATCATTG'
        'ATGCATGTACT'
    )
    # 模拟target
    target_sequence = ['TTTAGGG', 'CCCTAAA']
    # 模拟含有target的sequence
    # 这里添加了三个target序列
    sequence = (
        sequence[:10] +
        target_sequence[0] +  # target序列
        target_sequence[0] +  # target序列
        sequence[10:] +
        target_sequence[1]    # target序列
    )
    result = get_target_seq_position(
        sequence, 
        target_sequence
    )
    # 根据结果匹配出来的位置检查对应的序列是否与target相同
    for target, target_postion in result.items():
        tlen = len(target)
        for p in target_postion:
            print(
                p, 
                target, 
                target==sequence[p:p+tlen]
            )


相关文章
|
8月前
|
算法
算法编程(二十五):检查单词是否为句中其他单词的前缀
算法编程(二十五):检查单词是否为句中其他单词的前缀
71 0
|
7月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
8月前
|
存储 算法 前端开发
前端算法-最后一个单词的长度
前端算法-最后一个单词的长度
|
8月前
|
算法 Java C++
数据结构与算法面试题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。(提示:使用动态规划或者中心扩散)
数据结构与算法面试题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。(提示:使用动态规划或者中心扩散)
92 0
【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串
【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串
【基础算法】浅浅刷个小题 # 找不同 # 字符串中的单词数 # 重新排列字符串 #
【基础算法】浅浅刷个小题 # 找不同 # 字符串中的单词数 # 重新排列字符串 #
每日三题-无重复字符的最长子串、最长连续序列、找到字符串中所有字母异位词
每日三题 无重复字符的最长子串 最长连续序列 找到字符串中所有字母异位词
110 1
每日三题-无重复字符的最长子串、最长连续序列、找到字符串中所有字母异位词
|
算法 Java 索引
【算法】给定一个字符串 s 和一些长度相同的单词 words,串联所有单词的子串。要不要来试一试?
给定一个字符串 s 和一些长度相同的单词 words串联所有单词的子串
159 0
【算法】给定一个字符串 s 和一些长度相同的单词 words,串联所有单词的子串。要不要来试一试?
|
算法
【Day30】LeetCode算法 [769. 最多能完成排序的块 ] [2131. 连接两字母单词得到的最长回文串]
学习LeetCode算法 [769. 最多能完成排序的块 ] [2131. 连接两字母单词得到的最长回文串]。
122 0
【Day30】LeetCode算法 [769. 最多能完成排序的块 ] [2131. 连接两字母单词得到的最长回文串]
Leetcode | 连接两字母单词得到的最长回文串
Leetcode | 连接两字母单词得到的最长回文串
154 0
Leetcode | 连接两字母单词得到的最长回文串