fn(['super','bow','bowl','tar','get','book','let'], "superbowl") => ['super','bowl', [0,2]]
fn(['bow','crystal','organic','ally','rain','line'], "crystalline") => ['crystal','line', [1,5]]
fn(['bow','crystal','organic','ally','rain','line'], "rainbow") => ['bow','rain', [4,0]]
fn(['bow','crystal','organic','ally','rain','line'], "organically") => ['organic','ally', [2,3]]
fn(['top','main','tree','ally','fin','line'], "mainline") => ['main','line', [1,5]]
fn(['top','main','tree','ally','fin','line'], "treetop") => ['top','tree', [2,0]]
function compoundMatch(words, target) { /*дан массив слов и вторым аргументом слово, которое состоит из двух из массива, нужно найти из каких слов состоит и вернуть их */
const arr = [];
for (let i = 0; i < words.length; i++) {
if (target.includes(words[i])) { // здесь нахожу подстроки, которые имеются в во втором аргументе
arr.push(words[i]); // складываю их в массив
}
}
let part1;
let part2;
outer: for (let i = 0; i < arr.length; i++) { // перебираю массив подстрок
if (target.includes(arr[i])) {
part1 = arr[i]; // нахожу часть слова
for (let j = 0; j < arr.length; j++) { /* вот на это, как я понимаю, тратится бОльшая часть времени и от этих циклов надо избавляться*/
if (target.replace(part1, '') === arr[j]) { // отнимаю ее от слова и если оставшаяся часть равна элементу из массива
part2 = arr[j]; // сохраняю ее
break outer;
}
}
}
}
if (part1 === undefined || part2 === undefined) {
return null;
}
let indexes = part1 + part2 === target ? [words.indexOf(part1), words.indexOf(part2)] : [words.indexOf(part2), words.indexOf(part1)];
console.log([part1, part2, indexes]);
}
compoundMatch(['super','bow','bowl','tar','get','book','let'], 'superbowl'); // вернуть нужно в таком виде ['super', 'bowl', [0, 2]]
function compoundMatch(words, target) {
for (let i = 0; i < words.length; i++) {
for (let ii = 0; ii < words.length; ii++) {
const m1 = words[i] + words[ii] === target
const m2 = words[ii] + words[i] === target
if (i !== ii && (m1 || m2)) {
const arr = m1 ? [i, ii] : [ii, i]
return [words[i], words[ii], arr]
}
}
}
return null
}
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;
}
function compoundMatch(words, target) {
let srclist = {};
let list = words.reduce((a,w,i)=>{
if( srclist[w] ) return a;
srclist[w] = { w:w, i:i };
if( target.indexOf(w) !== 0 ) return a;
a[w] = { w:w, i:i };
return a;
},{});
srclist = Object.values(srclist);
list = Object.values(list);
const l = Object.keys(srclist).le
for(var i=0; i<list.length; i++){
const left = list[i];
left.s = target.substring(left.w.length);
for(var j=0; j<srclist.length; j++){
const right = srclist[j];
if( right.w.length === left.s.length && right.w === left.s )
return ( left.i<right.i ? [left.w, right.w, [left.i, right.i]] : [right.w, left.w, [left.i, right.i]] );
}
}
return null;
}