Решил топорно, по времени проходит. Но там такие крутые решения короткие в топе!
Обходить массив слов достаточно один раз.
Очередное слово может найтись в target в нулевой позиции - тогда оно "первое", или в другой, тогда надо проверить что та позиция + длина слова точно достают до конца target.
Складывать в массивы позицию подходящего слова и длину искомого другого слова.
Нашли очереденое Начальное слово - смотрим, есть ли ему соотв. искомая длина среди найденных Конечных.
Нашли очередное Конечное слово - смотрим, есть ли соответствующее ему по искомой длине Начальное среди уже найденных.
Как только нашлась пара - возвращаем ответ.
мое так-себе решениеfunction fn(words, target) {
const length = words.length, targetLength = target.length;
const aWord = []; // индексы слов в aWords
const aWant = []; // какой длины не хватает до целого
const bWord = [];
const bWant = [];
for (let i = 0; i < length; i++) {
const word = words[i];
const x = target.indexOf(word);
if (-1 === x) continue;
const wordLength = word.length;
const want = targetLength - wordLength;
if (x === 0) { // в начале составного, первое подслово
aWord.push(i);
aWant.push(want);
const bIndex = bWant.indexOf(wordLength);
if (-1 === bIndex) continue;
const bWordIndex = bWord[bIndex];
return [words[bWordIndex], word, [i, bWordIndex]];
} else { // не в начале слова встретилось - второе слово, в конце цели
if (x + wordLength !== targetLength) continue; // не попадает в конец
bWord.push(i);
bWant.push(want);
const aIndex = aWant.indexOf(wordLength);
if (-1 === aIndex) continue;
const aWordIndex = aWord[aIndex];
return [words[aWordIndex], word, [aWordIndex, i]];
}
}
return null;
}
крутая идея в топе
Бить целевое слово во всех возможных вариантах пар - а их даже меньше, чем длина целевого слова!
Искать каждые два слова в данном массиве. Если оба нашлись, вот оно, решение.
В 8 строк. Если поджать форматирование, то в 6.