Detector de subcadena repetida
Averigüe si una cadena es solo un fragmento escrito una y otra vez: ababab es ab tres veces y aaaa es a cuatro veces, mientras que aba no se repite. Obtiene la unidad más pequeña y el número exacto de repeticiones. Gratis en su navegador.
- Gratis
- Funciona en su navegador
- Sin registro
- Sus datos no salen de su equipo
Ejecutar — gratis
Ejemplo resuelto
- Texto
- ababab
- Unidad de longitud
- 2
- Cantidad
- 3
- Longitud
- 6
Muchos problemas de entrevista y controles de calidad de datos plantean una pregunta sencilla: ¿esta cadena no es más que un fragmento más corto escrito una y otra vez? Cadenas como ababab, aaaa y xyzxyzxyz se construyen así; abc y aba no. Este detector de patrón de subcadena repetida acepta un único campo de texto no vacío, ejecuta un análisis determinista de borde KMP (prefijo-sufijo propio más largo) y devuelve la unidad repetitiva más pequeña junto con el conteo exacto de repeticiones. No hay llamada de red, ni azar, ni dependencia del reloj: solo aritmética de cadenas que usted puede reejecutar byte a byte.
Qué es un patrón de subcadena repetida y cómo se elige la unidad
Una cadena tiene un patrón de subcadena repetida cuando coincide con alguna unidad no vacía escrita de extremo a extremo al menos dos veces, sin caracteres sobrantes. Por ejemplo, ababab es la unidad ab escrita tres veces, aaaa es la unidad a escrita cuatro veces y xyzxyz es la unidad xyz escrita dos veces. El detector siempre devuelve la unidad más pequeña: si una cadena puede embaldosarse tanto con ab como con abab, la respuesta es ab con un conteo mayor, no el candidato más largo.
Cuando ninguna unidad más corta cubre la longitud total, la cadena se informa como no repetida: unit es igual al texto original y count es igual a uno. La prueba clásica en tiempo lineal construye la tabla KMP del prefijo-sufijo propio más largo para la cadena de longitud n, define period como n menos la longitud del borde final y comprueba si period divide a n y es estrictamente menor que n.
Si ambas condiciones se cumplen, la unidad es el prefijo de longitud period y el conteo es n dividido por period. Esto coincide con el barrido por fuerza bruta de divisores que prueba cada longitud desde uno hasta el suelo de n entre dos, pero permanece O(n) y nunca depende de relojes flotantes ni de semillas aleatorias.
Las cadenas de un solo carácter y los resultados vacíos de validación se tratan de forma explícita: la longitud uno no puede ser una repetición no trivial, y el texto vacío o ausente se rechaza antes de que se ejecute cualquier trabajo LPS.
Dónde un detector de patrón repetido aporta valor real
La preparación de entrevistas y los cursos de algoritmos usan este problema para enseñar bordes, periodos y argumentos de divisores; un detector en vivo permite a los estudiantes comprobar ababab frente a aba sin armar a mano tablas LPS bajo presión de tiempo. Los docentes y autores de LMS necesitan un oráculo determinista que devuelva tanto el indicador booleano del patrón como la unidad concreta, de modo que los autoevaluadores acepten cualquier explicación correcta que nombre el mismo fragmento más pequeño.
Las canalizaciones de calidad de datos marcan columnas que parecen repeticiones accidentales de copiar y pegar (SKU SKU SKU, yesyesyes) antes de que contaminen índices de búsqueda o analítica. Las demostraciones de compresión y codificación ilustran estructura al estilo de longitud de ejecución sin pretender ser un compresor completo: mostrar que xyzxyzxyz son tres copias de xyz suele bastar para una diapositiva de clase. La validación fallida no consume saldo.
Qué puede hacer con ella
Práctica de entrevistas y algoritmos
Compruebe si una cadena es un patrón repetido no trivial y nombre la unidad más pequeña y el conteo frente a soluciones de libro con KMP y divisores.
Calidad de datos y pegados duplicados
Marque celdas o tokens que son repeticiones puras de un fragmento más corto antes de que entren en índices, catálogos o analítica.
Preguntas frecuentes
¿Cómo detecto un patrón de subcadena repetida?
Envíe una cadena no vacía en el campo text. Cuando la cadena no es una repetición no trivial, unit es la cadena completa y count es 1.
¿Qué es la unidad repetitiva más pequeña?
Es el prefijo no vacío más corto que embaldosa la cadena entera sin resto. Para ababab la unidad es ab (no abab). Para aaaa la unidad es a.
¿Qué algoritmo usa el detector?
Una prueba de periodo KMP del prefijo-sufijo propio más largo (LPS): si period = n - lps[n-1] divide a n y es más corto que n, la unidad es el prefijo de esa longitud. Equivale a probar cada longitud divisora, pero en tiempo lineal.
¿Qué obtengo si la cadena no se repite?
Una respuesta normal, no un error: el resultado indica que no hay repetición, la unidad es la cadena completa y el número de repeticiones es uno. Las cadenas únicas corrientes, como abc, se tratan igual.
¿La unidad tiene que cubrir toda la cadena?
Sí. Una cadena cuenta como repetida solo cuando la unidad, escrita al menos dos veces seguidas, la cubre sin que sobre ningún carácter. Por eso aba no es una repetición, aunque empiece y termine por a.
Herramientas relacionadas
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/dev/repeated-substring \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"ababab"}'const res = await fetch("https://api.kit.forhosting.com/dev/repeated-substring", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "ababab"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/repeated-substring",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "ababab"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/repeated-substring", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"ababab"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"ababab"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/repeated-substring", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"text": "ababab"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.repeated_substring",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |
Notas técnicas
Cuando ninguna unidad más corta embaldosa la cadena completa, la respuesta marca is_repeated en false, asigna unit al texto íntegro y count a uno, de modo que quienes llaman siempre obtienen un contrato estable.
Qué es un patrón de subcadena repetida y cómo se elige la unidad
Ese contrato es más amable con las canalizaciones que un error duro sobre no patrones, porque quien llama puede ramificar sobre is_repeated sin tratar las cadenas únicas ordinarias como entrada inválida.
Contrato de entrada, campos de respuesta y comportamiento ante errores
Ejemplo: aaaa produce unit a y count cuatro. Mantenga las entradas bajo el techo de caracteres documentado; los pegados demasiado grandes fallan con un mensaje de límite explícito en lugar de un recorte silencioso truncado. Envíe por POST un cuerpo JSON con un campo text obligatorio que contenga una cadena no vacía. Se aceptan los alias input, string, value, s y source para que formularios de consulta, hojas de cálculo y envoltorios SDK tipados reutilicen el mismo contrato sin renombrar columnas. Los números finitos y los bigint se convierten primero a cadena, de modo que un código de producto tecleado como número desnudo se analiza con limpieza; los booleanos, objetos planos y arrays se rechazan para que un cuerpo JSON equivocado no se convierta en la palabra true ni en un volcado de objeto poco útil. Las cadenas vacías y el text ausente fallan con invalid_input y no se facturan. En caso de éxito el cuerpo incluye text (eco de la cadena analizada), is_repeated (true cuando count es al menos dos), unit (el fragmento repetitivo más pequeño, o la cadena completa cuando no se repite), unit_length, count, length del texto original y method fijo en kmp_period para registros y canalizaciones multi-herramienta. Ejemplo: ababab produce unit ab, unit_length dos, count tres, is_repeated true. Ejemplo: abc produce unit abc, count uno, is_repeated false. Combine la ejecución gratuita del navegador en esta página con la API de pago cuando necesite la misma unidad y el mismo conteo dentro de CI, scripts de calificación o workers de borde sin reimplementar KMP usted mismo.
Dónde un detector de patrón repetido aporta valor real
Como la implementación es parse pura de nivel A, cada llamada exitosa cuesta el precio base publicado $0.002, sin tokens de modelo y sin red de salida.
Casos de integración
Autoevaluación LMS y deberes
Califique ítems de subcadena repetida con un oráculo determinista que devuelve unit, count e is_repeated para una comparación estable.
Preguntas técnicas
¿Qué ocurre si la cadena no está repetida?
La llamada sigue teniendo éxito: is_repeated es false, unit es igual al texto original y count es 1. Solo el text ausente o vacío es invalid_input.
¿Cuánto cuesta el detector de patrón de subcadena repetida?
La herramienta del navegador es gratuita. Las peticiones API usan saldo prepago de KIT a $0.002 por llamada exitosa; la entrada inválida no se factura.