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

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

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

样例:在一串序列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]
            )


相关文章
|
7月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
查找单词个数案列实现(字符串流)
查找单词个数案列实现(字符串流)
44 0
力扣1849 哪种连续子字符串更长
力扣1849 哪种连续子字符串更长
|
8月前
|
存储 算法 前端开发
前端算法-最后一个单词的长度
前端算法-最后一个单词的长度
|
8月前
|
算法 Java C++
数据结构与算法面试题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。(提示:使用动态规划或者中心扩散)
数据结构与算法面试题:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。(提示:使用动态规划或者中心扩散)
88 0
【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串
【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串
|
C语言
C语言:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
描述 输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。 输入描述: 输入包含三行, 第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。 第二行包含n个整数,用空格分隔。 第三行包含m个整数,用空格分隔。
294 0
C语言:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
【基础算法】浅浅刷个小题 # 找不同 # 字符串中的单词数 # 重新排列字符串 #
【基础算法】浅浅刷个小题 # 找不同 # 字符串中的单词数 # 重新排列字符串 #
每日三题-无重复字符的最长子串、最长连续序列、找到字符串中所有字母异位词
每日三题 无重复字符的最长子串 最长连续序列 找到字符串中所有字母异位词
105 1
每日三题-无重复字符的最长子串、最长连续序列、找到字符串中所有字母异位词
LeetCode 1869. 哪种连续子字符串更长
给你一个二进制字符串 s 。如果字符串中由 1 组成的 最长 连续子字符串 严格长于 由 0 组成的 最长 连续子字符串,返回 true ;否则,返回 false 。
80 0