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

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

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

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


相关文章
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
7月前
【错题集-编程题】包含不超过两种字符的最长字串(滑动窗口)
【错题集-编程题】包含不超过两种字符的最长字串(滑动窗口)
力扣1849 哪种连续子字符串更长
力扣1849 哪种连续子字符串更长
|
7月前
|
存储 算法 前端开发
前端算法-最后一个单词的长度
前端算法-最后一个单词的长度
【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串
【每日挠头算法题(8)】最后一个单词的长度|重新排列字符串
|
存储 算法 索引
【每日挠头算法题(3)】字符串解码|数组中重复的数字
【每日挠头算法题(3)】字符串解码|数组中重复的数字
每日三题-无重复字符的最长子串、最长连续序列、找到字符串中所有字母异位词
每日三题 无重复字符的最长子串 最长连续序列 找到字符串中所有字母异位词
99 1
每日三题-无重复字符的最长子串、最长连续序列、找到字符串中所有字母异位词
LeetCode 1869. 哪种连续子字符串更长
给你一个二进制字符串 s 。如果字符串中由 1 组成的 最长 连续子字符串 严格长于 由 0 组成的 最长 连续子字符串,返回 true ;否则,返回 false 。
76 0
|
算法
【Day30】LeetCode算法 [769. 最多能完成排序的块 ] [2131. 连接两字母单词得到的最长回文串]
学习LeetCode算法 [769. 最多能完成排序的块 ] [2131. 连接两字母单词得到的最长回文串]。
117 0
【Day30】LeetCode算法 [769. 最多能完成排序的块 ] [2131. 连接两字母单词得到的最长回文串]
滑动窗口__最长不含重复字符的子符串_和为S的连续正整数序列(剑指offer)
滑动窗口__最长不含重复字符的子符串_和为S的连续正整数序列(剑指offer)
106 0
滑动窗口__最长不含重复字符的子符串_和为S的连续正整数序列(剑指offer)