Skip to content
Prev Previous commit
Next Next commit
Added task 3475
  • Loading branch information
javadev committed Mar 6, 2025
commit e41b79460efcbe6d45a9644fe85bd4d6db468550
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package g3401_3500.s3462_maximum_sum_with_at_most_k_elements;

// #Medium #Array #Sorting #Greedy #Matrix #Heap_(Priority_Queue)
// #Medium #Array #Sorting #Greedy #Matrix #Heap_Priority_Queue
// #2025_02_25_Time_62_ms_(99.82%)_Space_78.09_MB_(20.19%)

import java.util.Arrays;

public class Solution {
public long maxSum(int[][] grid, int[] limits, int k) {
int l = 0;
for (int i = 0; i < limits.length; i++) {
l += limits[i];
for (int limit : limits) {
l += limit;
}
int[] dp = new int[l];
int a = 0;
Expand Down
98 changes: 98 additions & 0 deletions src/main/java/g3401_3500/s3475_dna_pattern_recognition/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
3475\. DNA Pattern Recognition

Medium

Table: `Samples`

+----------------+---------+
| Column Name | Type |
+----------------+---------+
| sample_id | int |
| dna_sequence | varchar |
| species | varchar |
+----------------+---------+
sample_id is the unique key for this table.
Each row contains a DNA sequence represented as a string of characters (A, T, G, C) and the species it was collected from.

Biologists are studying basic patterns in DNA sequences. Write a solution to identify `sample_id` with the following patterns:

* Sequences that **start** with **ATG** (a common **start codon**)
* Sequences that **end** with either **TAA**, **TAG**, or **TGA** (**stop codons**)
* Sequences containing the motif **ATAT** (a simple repeated pattern)
* Sequences that have **at least** `3` **consecutive** **G** (like **GGG** or **GGGG**)

Return _the result table ordered by __sample\_id in **ascending** order_.

The result format is in the following example.

**Example:**

**Input:**

Samples table:

+-----------+------------------+-----------+
| 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 |
+-----------+------------------+-----------+

**Output:**

+-----------+------------------+-------------+-------------+------------+------------+------------+
| 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 |
+-----------+------------------+-------------+-------------+------------+------------+------------+

**Explanation:**

* Sample 1 (ATGCTAGCTAGCTAA):
* Starts with ATG (has\_start = 1)
* Ends with TAA (has\_stop = 1)
* Does not contain ATAT (has\_atat = 0)
* Does not contain at least 3 consecutive 'G's (has\_ggg = 0)
* Sample 2 (GGGTCAATCATC):
* Does not start with ATG (has\_start = 0)
* Does not end with TAA, TAG, or TGA (has\_stop = 0)
* Does not contain ATAT (has\_atat = 0)
* Contains GGG (has\_ggg = 1)
* Sample 3 (ATATATCGTAGCTA):
* Does not start with ATG (has\_start = 0)
* Does not end with TAA, TAG, or TGA (has\_stop = 0)
* Contains ATAT (has\_atat = 1)
* Does not contain at least 3 consecutive 'G's (has\_ggg = 0)
* Sample 4 (ATGGGGTCATCATAA):
* Starts with ATG (has\_start = 1)
* Ends with TAA (has\_stop = 1)
* Does not contain ATAT (has\_atat = 0)
* Contains GGGG (has\_ggg = 1)
* Sample 5 (TCAGTCAGTCAG):
* Does not match any patterns (all fields = 0)
* Sample 6 (ATATCGCGCTAG):
* Does not start with ATG (has\_start = 0)
* Ends with TAG (has\_stop = 1)
* Starts with ATAT (has\_atat = 1)
* Does not contain at least 3 consecutive 'G's (has\_ggg = 0)
* Sample 7 (CGTATGCGTCGTA):
* Does not start with ATG (has\_start = 0)
* Does not end with TAA, "TAG", or "TGA" (has\_stop = 0)
* Does not contain ATAT (has\_atat = 0)
* Does not contain at least 3 consecutive 'G's (has\_ggg = 0)

**Note:**

* The result is ordered by sample\_id in ascending order
* For each pattern, 1 indicates the pattern is present and 0 indicates it is not present
13 changes: 13 additions & 0 deletions src/main/java/g3401_3500/s3475_dna_pattern_recognition/script.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Write your MySQL query statement below
# #Medium #2025_03_04_Time_645_ms_(100.00%)_Space_0.0_MB_(100.00%)
WITH SampleAnalysisCte AS (
SELECT sample_id, dna_sequence, species,
dna_sequence REGEXP '^ATG' AS has_start,
dna_sequence REGEXP 'TAA$|TAG$|TGA$' AS has_stop,
dna_sequence REGEXP '.*ATAT.*' AS has_atat,
dna_sequence REGEXP '.*GGG.*' AS has_ggg
FROM Samples
)

SELECT * FROM SampleAnalysisCte
ORDER BY sample_id;
118 changes: 118 additions & 0 deletions src/test/java/g3401_3500/s3475_dna_pattern_recognition/MysqlTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
package g3401_3500.s3475_dna_pattern_recognition;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.stream.Collectors;
import javax.sql.DataSource;
import org.junit.jupiter.api.Test;
import org.zapodot.junit.db.annotations.EmbeddedDatabase;
import org.zapodot.junit.db.annotations.EmbeddedDatabaseTest;
import org.zapodot.junit.db.common.CompatibilityMode;

@EmbeddedDatabaseTest(
compatibilityMode = CompatibilityMode.MySQL,
initialSqls =
" CREATE TABLE Samples ("
+ " sample_id INT,"
+ " dna_sequence VARCHAR(100),"
+ " species VARCHAR(100)"
+ ");"
+ "insert into Samples (sample_id, dna_sequence, species) values "
+ "(1, 'ATGCTAGCTAGCTAA', 'Human');"
+ "insert into Samples (sample_id, dna_sequence, species) values "
+ "(2, 'GGGTCAATCATC', 'Human');"
+ "insert into Samples (sample_id, dna_sequence, species) values "
+ "(3, 'ATATATCGTAGCTA', 'Human');"
+ "insert into Samples (sample_id, dna_sequence, species) values "
+ "(4, 'ATGGGGTCATCATAA', 'Human');"
+ "insert into Samples (sample_id, dna_sequence, species) values "
+ "(5, 'TCAGTCAGTCAG', 'Human');"
+ "insert into Samples (sample_id, dna_sequence, species) values "
+ "(6, 'ATATCGCGCTAG', 'Zebrafish');"
+ "insert into Samples (sample_id, dna_sequence, species) values "
+ "(7, 'CGTATGCGTCGTA', 'Zebrafish');")
class MysqlTest {
@Test
void testScript(@EmbeddedDatabase DataSource dataSource)
throws SQLException, FileNotFoundException {
try (final Connection connection = dataSource.getConnection()) {
try (final Statement statement = connection.createStatement();
final ResultSet resultSet =
statement.executeQuery(
new BufferedReader(
new FileReader(
"src/main/java/g3401_3500/"
+ "s3475_dna_pattern_recognition/"
+ "script.sql"))
.lines()
.collect(Collectors.joining("\n"))
.replaceAll("#.*?\\r?\\n", ""))) {
assertThat(resultSet.next(), equalTo(true));
assertThat(resultSet.getNString(1), equalTo("1"));
assertThat(resultSet.getNString(2), equalTo("ATGCTAGCTAGCTAA"));
assertThat(resultSet.getNString(3), equalTo("Human"));
assertThat(resultSet.getNString(4), equalTo("TRUE"));
assertThat(resultSet.getNString(5), equalTo("TRUE"));
assertThat(resultSet.getNString(6), equalTo("FALSE"));
assertThat(resultSet.getNString(7), equalTo("FALSE"));
assertThat(resultSet.next(), equalTo(true));
assertThat(resultSet.getNString(1), equalTo("2"));
assertThat(resultSet.getNString(2), equalTo("GGGTCAATCATC"));
assertThat(resultSet.getNString(3), equalTo("Human"));
assertThat(resultSet.getNString(4), equalTo("FALSE"));
assertThat(resultSet.getNString(5), equalTo("FALSE"));
assertThat(resultSet.getNString(6), equalTo("FALSE"));
assertThat(resultSet.getNString(7), equalTo("TRUE"));
assertThat(resultSet.next(), equalTo(true));
assertThat(resultSet.getNString(1), equalTo("3"));
assertThat(resultSet.getNString(2), equalTo("ATATATCGTAGCTA"));
assertThat(resultSet.getNString(3), equalTo("Human"));
assertThat(resultSet.getNString(4), equalTo("FALSE"));
assertThat(resultSet.getNString(5), equalTo("FALSE"));
assertThat(resultSet.getNString(6), equalTo("TRUE"));
assertThat(resultSet.getNString(7), equalTo("FALSE"));
assertThat(resultSet.next(), equalTo(true));
assertThat(resultSet.getNString(1), equalTo("4"));
assertThat(resultSet.getNString(2), equalTo("ATGGGGTCATCATAA"));
assertThat(resultSet.getNString(3), equalTo("Human"));
assertThat(resultSet.getNString(4), equalTo("TRUE"));
assertThat(resultSet.getNString(5), equalTo("TRUE"));
assertThat(resultSet.getNString(6), equalTo("FALSE"));
assertThat(resultSet.getNString(7), equalTo("TRUE"));
assertThat(resultSet.next(), equalTo(true));
assertThat(resultSet.getNString(1), equalTo("5"));
assertThat(resultSet.getNString(2), equalTo("TCAGTCAGTCAG"));
assertThat(resultSet.getNString(3), equalTo("Human"));
assertThat(resultSet.getNString(4), equalTo("FALSE"));
assertThat(resultSet.getNString(5), equalTo("FALSE"));
assertThat(resultSet.getNString(6), equalTo("FALSE"));
assertThat(resultSet.getNString(7), equalTo("FALSE"));
assertThat(resultSet.next(), equalTo(true));
assertThat(resultSet.getNString(1), equalTo("6"));
assertThat(resultSet.getNString(2), equalTo("ATATCGCGCTAG"));
assertThat(resultSet.getNString(3), equalTo("Zebrafish"));
assertThat(resultSet.getNString(4), equalTo("FALSE"));
assertThat(resultSet.getNString(5), equalTo("TRUE"));
assertThat(resultSet.getNString(6), equalTo("TRUE"));
assertThat(resultSet.getNString(7), equalTo("FALSE"));
assertThat(resultSet.next(), equalTo(true));
assertThat(resultSet.getNString(1), equalTo("7"));
assertThat(resultSet.getNString(2), equalTo("CGTATGCGTCGTA"));
assertThat(resultSet.getNString(3), equalTo("Zebrafish"));
assertThat(resultSet.getNString(4), equalTo("FALSE"));
assertThat(resultSet.getNString(5), equalTo("FALSE"));
assertThat(resultSet.getNString(6), equalTo("FALSE"));
assertThat(resultSet.getNString(7), equalTo("FALSE"));
assertThat(resultSet.next(), equalTo(false));
}
}
}
}