SQL-leetcode—3475. DNA 模式识别

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 开头 的序列(一个常见的 起始密码子)

以 TAA,TAG 或 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 表示不存在

题解

分析需求中的 4 个判断条件

  • has_start:dna_sequence 以 ATG 开头 → 符合为 1,否则为 0。
  • has_stop:dna_sequence 以 TAA、TAG 或 TGA 结尾 → 符合为 1,否则为 0。
  • has_atat:dna_sequence 包含子串 ATAT → 符合为 1,否则为 0。
  • has_ggg:dna_sequence 包含至少 3 个连续的 G(即 GGG 或更多,如 GGGG)→ 符合为 1,否则为 0。

方法一

复制代码
SELECT 
  sample_id,
  dna_sequence,
  species,
  -- 判断是否以 ATG 开头
  CASE WHEN dna_sequence LIKE 'ATG%' THEN 1 ELSE 0 END AS has_start,
  -- 判断是否以 TAA、TAG 或 TGA 结尾
  CASE 
    WHEN dna_sequence LIKE '%TAA' 
      OR dna_sequence LIKE '%TAG' 
      OR dna_sequence LIKE '%TGA' 
    THEN 1 ELSE 0 
  END AS has_stop,
  -- 判断是否包含 ATAT 子串
  CASE WHEN dna_sequence LIKE '%ATAT%' THEN 1 ELSE 0 END AS has_atat,
  -- 判断是否包含至少 3 个连续的 G(GGG 及以上)
  CASE WHEN dna_sequence LIKE '%GGG%' THEN 1 ELSE 0 END AS has_ggg
FROM Samples
ORDER BY sample_id ASC; -- 按 sample_id 升序排序
相关推荐
老纪的技术唠嗑局20 小时前
超级干货分享:中小企业使用 OceanBase 实践经验汇总
数据库
CLOUD ACE21 小时前
谷歌云代理|零售商Target 如何利用 Spanner Graph 提升零售发现体验并将数据库维护成本降低 50%
数据库·零售
AI大模型-小雄21 小时前
Codex写分页接口为什么越翻越慢?用Cursor Pagination解决重复与漏数据
大数据·数据库·elasticsearch·搜索引擎·chatgpt·后端开发·codex
少晓年21 小时前
从 MySQL 迁移到人大金仓 KingbaseES:完整指南与实践
数据库·mysql
SelectDB1 天前
Apache Doris AI RAG 实战:从基础 RAG 到知识图谱增强的技术能力与选型
数据库
SelectDB1 天前
电商企业 PostgreSQL 迁移 Apache Doris:80TB 分析数据统一平台技术能力与实践
数据库
SelectDB1 天前
阶跃星辰 Agent 可观测:Apache Doris / SelectDB 的技术能力与实践
数据库
SelectDB1 天前
ApacheDoris Iceberg V3 湖仓 DML:Apache Doris / SelectDB 的技术能力与实践
数据库
SelectDB1 天前
ApacheDoris Python UDF:SQL 调用 Python 的技术能力、选型对比与实践
数据库
Crazy________1 天前
Redis03:持久化存储,大key分析,主从复制及哨兵模式
数据库·redis·容器