(estoy escribiendo esto en el contexto de JavaScript, pero aceptará una respuesta correcta mediante algoritmos en cualquier idioma)la única subcadena más pequeña para cada cadena en una matriz
¿Cómo se encuentra el la subcadena más corta de cada elemento en una matriz de cadenas donde la subcadena NO está contenida en ninguno de los otros elementos, ignorando el caso?
Supongamos que tengo una matriz de entrada, tales como:
var names = ["Anne", "Anthony", "LouAnn", "Kant", "Louise", "ark"];
La salida debe ser algo como:
var uniqueNames = ["ne", "h", "ua", "ka", "i", "r"];
Para mis propósitos, se puede asumir con seguridad que ningún elemento será totalmente contenido dentro de otro elemento
Mis Pensamientos:
Parece que uno podría probablemente la fuerza bruta de este, a lo largo de las líneas de:
var names = ["Anne", "Anthony", "LouAnn", "Kant", "Louise", "ark"];
var uniqueNames = [], nameInd, windowSize, substrInd, substr, otherNameInd, foundMatch;
// For each name
for (nameInd = 0; nameInd < names.length; nameInd++)
{
var name = names[nameInd];
// For each possible substring length
windowLoop:
for (windowSize = 1; windowSize <= name.length; windowSize++)
{
// For each starting index of a substring
for (substrInd = 0; substrInd <= name.length-windowSize; substrInd++)
{
substr = name.substring(substrInd,substrInd+windowSize).toLowerCase();
foundMatch = false;
// For each other name
for (otherNameInd = 0; otherNameInd < names.length; otherNameInd++)
{
if (nameInd != otherNameInd && names[otherNameInd].toLowerCase().indexOf(substr) > -1)
{
foundMatch = true;
break;
}
}
if (!foundMatch)
{
// This substr works!
uniqueNames[nameInd] = substr;
break windowLoop;
}
}
}
}
Pero tengo que imaginar que hay una solución más elegante usando tries/árboles prefijo, sufijo arrays, o algo tan interesante como eso.
Editar: Creo que esta es la forma de la respuesta seleccionada tomaría mediante programación en JavaScript:
var names = ["Anne", "Anthony", "LouAnn", "Kant", "Louise", "ark"];
var uniqueNames = [], permutations = {}, permutation, nameInd, windowSize, substrInd, substr;
// For each name
for (nameInd = 0; nameInd < names.length; nameInd++)
{
var name = names[nameInd];
// For each possible substring length
windowLoop:
for (windowSize = 1; windowSize <= name.length; windowSize++)
{
// For each starting index of a substring
for (substrInd = 0; substrInd <= name.length-windowSize; substrInd++)
{
substr = name.substring(substrInd,substrInd+windowSize).toLowerCase();
permutations[substr] = (typeof permutations[substr] === "undefined")?nameInd:-1;
}
}
}
for (substr in permutations)
{
permutation = permutations[substr];
if (permutation !== -1 && ((typeof uniqueNames[permutation] === "string" && substr.length < uniqueNames[permutation].length) || typeof uniqueNames[permutation] === "undefined"))
{
uniqueNames[permutation] = substr;
}
}
¿El resultado de la muestra es incorrecto? No veo 's' y' y' allí mientras que es ver 'i, h' y' r' ... – Icarus
@Icarus Ah, buen punto. 's' y' y' no están presentes solo porque no estoy buscando las subcadenas más pequeñas que se ajusten a los criterios, más bien cualquiera es lo suficientemente bueno. Aceptaría una respuesta que me devolviera una matriz bidimensional de todos ellos, pero realmente no necesito ese nivel de detalle. Una salida igualmente válida podría ser 'var uniqueNames = [" ne "," y "," ua "," ka "," i "," s "];' – Patrick
¿Es posible limitar su alfabeto de entrada? a 26 caracteres (o algo como esto, simplemente limítelo)? –