Find Products with Three Consecutive Digits
EasyUpdated: Sep 29, 2025
Practice on:
Problem
Table: Products
| Column Name | Type |
+-------------+---------+
| product_id | int |
| name | varchar |
+-------------+---------+
product_id is the unique key for this table.
Each row of this table contains the ID and name of a product.
Write a solution to find all products whose names contain a sequence of exactly three digits in a row.
Return the result table ordered by product_id in ascending order.
The result format is in the following example.
Examples
Example 1:
**Input:**
products table:
+-------------+--------------------+
| product_id | name |
+-------------+--------------------+
| 1 | ABC123XYZ |
| 2 | A12B34C |
| 3 | Product56789 |
| 4 | NoDigitsHere |
| 5 | 789Product |
| 6 | Item003Description |
| 7 | Product12X34 |
+-------------+--------------------+
**Output:**
+-------------+--------------------+
| product_id | name |
+-------------+--------------------+
| 1 | ABC123XYZ |
| 5 | 789Product |
| 6 | Item003Description |
+-------------+--------------------+
**Explanation:**
- Product 1: ABC123XYZ contains the digits 123.
- Product 5: 789Product contains the digits 789.
- Product 6: Item003Description contains 003, which is exactly three digits.
**Note:**
- Results are ordered by `product_id` in ascending order.
- Only products with exactly three consecutive digits in their names are included in the result.
Solution
Method 1 – Regex Pattern Matching
Intuition
We need to find product names that contain a sequence of exactly three digits in a row. This can be efficiently done using a regular expression that matches three consecutive digits not part of a longer digit sequence.
Approach
- Use a regular expression to match names containing exactly three consecutive digits (not part of a longer digit sequence).
- In SQL, use
REGEXP(MySQL) or~(PostgreSQL) to filter such names. - Return the result ordered by
product_idascending.
Code
MySQL
SELECT product_id, name
FROM Products
WHERE name REGEXP '[^0-9][0-9]{3}[^0-9]' OR name REGEXP '^[0-9]{3}[^0-9]' OR name REGEXP '[^0-9][0-9]{3}$' OR name REGEXP '^[0-9]{3}$'
ORDER BY product_id;
PostgreSQL
SELECT product_id, name
FROM Products
WHERE name ~ '(^|[^0-9])[0-9]{3}([^0-9]|$)'
ORDER BY product_id;
Python (pandas)
class Solution:
def find_products_with_three_consecutive_digits(self, df):
# df has columns: product_id, name
import pandas as pd
pat = r'(^|[^0-9])[0-9]{3}([^0-9]|$)'
result = df[df['name'].str.contains(pat, regex=True)].copy()
return result.sort_values('product_id')[['product_id', 'name']]
Complexity
- ⏰ Time complexity:
O(n), wherenis the number of products, since each name is checked once. - 🧺 Space complexity:
O(k), wherekis the number of matching products in the result.