Как определить место "склейки" двух массивов?

Есть два массива, один массив это начало, второй продолжение... Мне нужно определить в каком месте их нужно склеить, вся сложность в том, что мне неизвестно когда один из них закончился, и с какого места продолжился второй....

пример: [4,6,1,g,4,w,r,u,4] и [r,u,4,7,2,a,r,u,6]

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

для человека ничего сложного, а вот как реализовать такую логику, чет не пойму, сами массивы могут содержать около 1000 значений каждый, мне хоть подсказал бы кто!?

Можно на php, можно на js не важно, склеить бы...


Ответы (2 шт):

Автор решения: Митя ТоДаСё

парни в чате телеги подсказали

на php https://www.php.net/manual/en/function.array-intersect.php

на nodejs https://www.npmjs.com/package/array-intersection

<script src="//onlinegdb.com/embed/js/rkhCTQRf_?theme=dark"></script>

→ Ссылка
Автор решения: teran

Забавная задачка. Если я условие правильно понял, то для входных данных

[1,2,3] и [2,3,4,5]

значения 2-3 из начала второго массива выкидываются, и остается [1,2,3,4,5].

Если второй массив длиннее первого, то берем его начало соответствующей длины. Если первый длиннее второго, то берем конец первого соответствующей длины.

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

function merge_tail($a, $b){
    $start = $a;
    $tail  = $b;
    
    if(count($b) > count($a)){
        $tail = array_slice($b, 0, count($a));
    }
    else{
        $start = array_slice($a, -count($b));
    }

    while($tail && $start != $tail){            
        array_shift($start);
        array_pop($tail);
    }
    
    return array_merge($a, array_slice($b, count($tail)));
}
→ Ссылка