Найдите наименьшую уникальную подстроку для каждой строки в массиве

(Я пишу это в контексте JavaScript, но приму алгоритмически правильный ответ на любом языке)

Как найти кратчайшую подстроку каждого элемента в массиве строк, где подстрока НЕ ​​содержится ни в одном из других элементов, игнорируя регистр?

Предположим, у меня есть входной массив, такой как:

var names = ["Anne", "Anthony", "LouAnn", "Kant", "Louise", "ark"];

Вывод должен быть примерно таким:

var uniqueNames = ["ne", "h", "ua", "ka", "i", "r"];

Для моих целей вы можете с уверенностью предположить, что ни один элемент не будет полностью содержаться внутри другого элемента.

Мои мысли:
Кажется, что можно было бы, вероятно, переборщить с этим, в соответствии с:

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;
            }
        }
    }
}

Но я должен представить, что есть более элегантное решение, использующее деревья попыток/префиксов, массивы суффиксов или что-то интересное в этом роде.

Изменить :Я считаю, что это форма, которую выбранный ответ примет программно в 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;
    }
}
11
задан Patrick 16 July 2012 в 20:18
поделиться