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 表示不存在
解法
方法一:模糊匹配 + 正则表达式
我们可以利用 LIKE
和 REGEXP
来进行模式匹配,其中:
- 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 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|