跳转至

3475. DNA 模式识别

题目描述

表:Samples

+----------------+---------+
| Column Name    | Type    | 
+----------------+---------+
| sample_id      | int     |
| dna_sequence   | varchar |
| species        | varchar |
+----------------+---------+
sample_id 是这张表的唯一主键。
每一行包含一个 DNA 序列以一个字符(A,T,G,C)组成的字符串表示以及它所采集自的物种。

生物学家正在研究 DNA 序列中的基本模式。编写一个解决方案以识别具有以下模式的 sample_id

  • 以 ATG 开头 的序列(一个常见的 起始密码子
  • TAATAG 或 TGA 结尾 的序列(终止密码子)
  • 包含基序 ATAT 的序列(一个简单重复模式)
  • 至少 3 个连续 G 的序列(如 GGG 或 GGGG

返回结果表以 sample_id 升序 排序

结果格式如下所示。

 

示例:

输入:

Samples 表:

+-----------+------------------+-----------+
| sample_id | dna_sequence     | species   |
+-----------+------------------+-----------+
| 1         | ATGCTAGCTAGCTAA  | Human     |
| 2         | GGGTCAATCATC     | Human     |
| 3         | ATATATCGTAGCTA   | Human     |
| 4         | ATGGGGTCATCATAA  | Mouse     |
| 5         | TCAGTCAGTCAG     | Mouse     |
| 6         | ATATCGCGCTAG     | Zebrafish |
| 7         | CGTATGCGTCGTA    | Zebrafish |
+-----------+------------------+-----------+

输出:

+-----------+------------------+-------------+-------------+------------+------------+------------+
| sample_id | dna_sequence     | species     | has_start   | has_stop   | has_atat   | has_ggg    |
+-----------+------------------+-------------+-------------+------------+------------+------------+
| 1         | ATGCTAGCTAGCTAA  | Human       | 1           | 1          | 0          | 0          |
| 2         | GGGTCAATCATC     | Human       | 0           | 0          | 0          | 1          |
| 3         | ATATATCGTAGCTA   | Human       | 0           | 0          | 1          | 0          |
| 4         | ATGGGGTCATCATAA  | Mouse       | 1           | 1          | 0          | 1          |
| 5         | TCAGTCAGTCAG     | Mouse       | 0           | 0          | 0          | 0          |
| 6         | ATATCGCGCTAG     | Zebrafish   | 0           | 1          | 1          | 0          |
| 7         | CGTATGCGTCGTA    | Zebrafish   | 0           | 0          | 0          | 0          |
+-----------+------------------+-------------+-------------+------------+------------+------------+

解释:

  • 样本 1(ATGCTAGCTAGCTAA):
    • 以 ATG 开头(has_start = 1)
    • 以 TAA 结尾(has_stop = 1)
    • 不包含 ATAT(has_atat = 0)
    • 不包含至少 3 个连续 ‘G’(has_ggg = 0)
  • 样本 2(GGGTCAATCATC):
    • 不以 ATG 开头(has_start = 0)
    • 不以 TAA,TAG 或 TGA 结尾(has_stop = 0)
    • 不包含 ATAT(has_atat = 0)
    • 包含 GGG(has_ggg = 1)
  • 样本 3(ATATATCGTAGCTA):
    • 不以 ATG 开头(has_start = 0)
    • 不以 TAA,TAG 或 TGA 结尾(has_stop = 0)
    • 包含 ATAT(has_atat = 1)
    • 不包含至少 3 个连续 ‘G’(has_ggg = 0)
  • 样本 4(ATGGGGTCATCATAA):
    • 以 ATG 开头(has_start = 1)
    • 以 TAA 结尾(has_stop = 1)
    • 不包含 ATAT(has_atat = 0)
    • 包含 GGGG(has_ggg = 1)
  • 样本 5(TCAGTCAGTCAG):
    • 不匹配任何模式(所有字段 = 0)
  • 样本 6(ATATCGCGCTAG):
    • 不以 ATG 开头(has_start = 0)
    • 以 TAG 结尾(has_stop = 1)
    • 包含 ATAT(has_atat = 1)
    • 不包含至少 3 个连续 ‘G’(has_ggg = 0)
  • 样本 7(CGTATGCGTCGTA):
    • 不以 ATG 开头(has_start = 0)
    • 不以 TAA,TAG 或 TGA 结尾(has_stop = 0)
    • 不包含 ATAT(has_atat = 0)
    • 不包含至少 3 个连续 ‘G’(has_ggg = 0)

注意:

  • 结果以 sample_id 升序排序
  • 对于每个模式,1 表示该模式存在,0 表示不存在

解法

方法一:模糊匹配 + 正则表达式

我们可以利用 LIKEREGEXP 来进行模式匹配,其中:

  • LIKE 'ATG%' 检测是否以 ATG 开头
  • REGEXP 'TAA$|TAG$|TGA$' 检测是否以 TAA、TAG 或 TGA 结尾($ 表示字符串结尾)
  • LIKE '%ATAT%' 检测是否包含 ATAT
  • REGEXP 'GGG+' 检测是否包含至少 3 个 G
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Write your MySQL query statement below
SELECT
    sample_id,
    dna_sequence,
    species,
    dna_sequence LIKE 'ATG%' AS has_start,
    dna_sequence REGEXP 'TAA$|TAG$|TGA$' AS has_stop,
    dna_sequence LIKE '%ATAT%' AS has_atat,
    dna_sequence REGEXP 'GGG+' AS has_ggg
FROM Samples
ORDER BY 1;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import pandas as pd


def analyze_dna_patterns(samples: pd.DataFrame) -> pd.DataFrame:
    samples["has_start"] = samples["dna_sequence"].str.startswith("ATG").astype(int)
    samples["has_stop"] = (
        samples["dna_sequence"].str.endswith(("TAA", "TAG", "TGA")).astype(int)
    )
    samples["has_atat"] = samples["dna_sequence"].str.contains("ATAT").astype(int)
    samples["has_ggg"] = samples["dna_sequence"].str.contains("GGG+").astype(int)
    return samples.sort_values(by="sample_id").reset_index(drop=True)

评论