Lenguajes Formales
En Programación Competitiva, muchos problemas de strings (como validación de paréntesis o búsqueda de patrones) son en realidad problemas de Teoría de Lenguajes.
Conceptos Básicos
Section titled “Conceptos Básicos”Alfabeto ()
Section titled “Alfabeto (Σ\SigmaΣ)”Un conjunto finito de símbolos.
- Ejemplo:
Lenguaje ()
Section titled “Lenguaje (LLL)”Un conjunto de strings formadas con símbolos de .
- Formalmente:
Operaciones
Section titled “Operaciones”Sean y dos lenguajes:
- Unión: (Cadenas que están en uno u otro).
- Concatenación: .
- Cerradura de Kleene (): Repetir cero o más veces (incluye la cadena vacía ).
- Cerradura Positiva (): Repetir una o más veces.
Expresiones Regulares (Regex)
Section titled “Expresiones Regulares (Regex)”Son una notación algebraica para definir lenguajes regulares (patrones).
Ejemplo: Definir un lenguaje para números (enteros o decimales, positivos o negativos).
- Alfabeto: Dígitos , signo , punto .
- Expresión:
| Parte | Significado |
|---|---|
| Un guion opcional. | |
| Uno o más dígitos (parte entera). | |
| Opcionalmente, un punto y más dígitos. |
Gramáticas y Recursión
Section titled “Gramáticas y Recursión”Una gramática define reglas para generar cadenas. Son la base de problemas como “Paréntesis Balanceados”.
Ejemplo: ¿Está bien formada (())()?
Reglas recursivas para una cadena válida :
- (Cadena vacía es válida).
- (Podemos rodear una válida con paréntesis).
- (Podemos concatenar dos válidas).
Autómatas Finitos
Section titled “Autómatas Finitos”Un autómata es una máquina abstracta que lee una cadena y cambia de estado. Al final, decide si Acepta o Rechaza.
Ejemplo: Paridad de 1s
Section titled “Ejemplo: Paridad de 1s”Queremos aceptar cadenas binarias con un número par de 1s.
- Estados: (Inicial, Aceptación), .
- Transiciones:
- Si leo
0: Me quedo donde estoy. - Si leo
1: Cambio de estado ().
- Si leo
Si la cadena termina en , es válida.
Búsqueda de Patrones
Section titled “Búsqueda de Patrones”La teoría de autómatas y hashing es la base de los algoritmos de búsqueda eficientes (más rápidos que el .find() básico que es ).
- Rabin-Karp: Usa Rolling Hash (Prefix Sum de hashes) para comparar patrones en .
- KMP (Knuth-Morris-Pratt): Construye un autómata (o arreglo de prefijos LPS) para no retroceder nunca en el texto. Complejidad .
Ejercicio Teórico/Práctico
Section titled “Ejercicio Teórico/Práctico”- 1971D. Binary Cut (Codeforces) - Analizar la estructura de la cadena para minimizar cortes.