Đạo hàm Brzozowski (Brzozowski derivative) là một kỹ thuật xây dựng động cơ regex không cần dựng tường minh NFA hay DFA: đạo hàm Dc(R) của biểu thức R theo ký hiệu c là một biểu thức chính quy mô tả đúng phần còn lại cần khớp, sau khi giả sử ký hiệu đầu tiên đã đọc được là c. Một chuỗi w=c1c2…ck được R chấp nhận khi và chỉ khi biểu thức Dck(…Dc1(R)…) là nullable (chấp nhận được chuỗi rỗng).
Bảng chữ cái chỉ gồm hai ký hiệu 0 và 1. Biểu thức chính quy R được xây dựng từ:
0, 1: hai ký hiệu đơn.@: ký hiệu đặc biệt biểu diễn ngôn ngữ {ε} (chỉ chấp nhận chuỗi rỗng).#: ký hiệu đặc biệt biểu diễn ngôn ngữ rỗng ∅ (không chấp nhận bất kỳ chuỗi nào, kể cả chuỗi rỗng).| (ưu tiên thấp nhất), các toán tử hậu tố *, +, ? (ưu tiên cao nhất), và dấu ngoặc đơn ( ) để nhóm — ngữ nghĩa như thông thường trong lý thuyết ngôn ngữ hình thức.Cho R và q chuỗi truy vấn (mỗi chuỗi chỉ gồm ký tự 0/1, có thể là chuỗi rỗng), với mỗi chuỗi hãy xác định chuỗi đó có thuộc ngôn ngữ L(R) hay không.
Ví dụ: R= 0?1+ (không có hoặc có một ký tự 0, theo sau bởi một hoặc nhiều ký tự 1). Với truy vấn 1: thuộc L(R). Với truy vấn 01: thuộc L(R).
Dòng 1: biểu thức chính quy R (độ dài từ 1 đến 100 ký tự, không chứa khoảng trắng).
Dòng 2: số nguyên q (1≤q≤20) — số chuỗi truy vấn.
q dòng tiếp theo, mỗi dòng là một chuỗi truy vấn chỉ gồm ký tự 0/1 (có thể là dòng rỗng nếu truy vấn là chuỗi rỗng), độ dài mỗi truy vấn không quá 30.
Với mỗi chuỗi truy vấn theo đúng thứ tự xuất hiện trong input, in ra một dòng YES nếu chuỗi đó thuộc L(R), ngược lại in ra NO.
Với ví dụ ở trên (R= 0?1+, truy vấn 1 rồi 01), kết quả in ra là:
YES
YES
Ví dụ:
Đầu vào:
0*1(0|1)*
5
1
01
00
111
Đầu ra:
NO
YES
YES
NO
YES
Đầu vào:
(0|1)*
2
0110
Đầu ra:
YES
YES
Đang tải editor...