Как найти максимальную последовательность символов в конце массива, которые совпадают с началом массива?

Я хочу написать код, который находит максимальную последовательность символов в конце массива, которые совпадают с началом массива.

Но я не знаю, как я могу сделать это с помощью PHP?

Например:

Input = [a,b,c,e,r,t,x,s,b,a,b,c]
Output = [a,b,c]

(потому что элементы a,b,c находятся как в начале, так и в конце массива и представляют максимальную последовательность таких символов)

4

Решение

Замечания: Это будет отлично работать для такого типа массива, где у нас есть массив строк, это не работает для вложенного массива.

Попробуйте этот фрагмент кода здесь

<?php
ini_set('display_errors', 1);
$data  = array("a","b","c","e","r","t","x","s","b","a","b","c");
$string=  implode("", $data);//converting array to string.
for($x=strlen($string)-1;$x>=0;$x--)
{
//matching substring from the end of string.
if(preg_match("/".substr($string, 0,$x)."$/",$string)==true)
{
$string= substr($string, 0,$x);
break;
}
}
$result=str_split($string);
print_r($result);
3

Другие решения

Я надеюсь, что этот код будет работать:

 <?php
$Input  = array('a','b','c','e','r','t','x','s','b','a','b','c');
$len=count($Input);
$j=$len-1;
$count=0;
$s=0;
$k=$n=0;
$a[$len/2];
for($i=0;$i<$len;$i++)
{
if($Input[$i]!=$Input[$j]){
$j--;
$i--;
}
if($Input[$i]==$Input[$j]){
$count++;
$a[$n]=$Input[$j];
$n++;
if($k==$j)
{
$s++;
break;
}
$k=$j;

if($j!=$len-1)
$j++;
else
break;
}
}
if($s!=0)
echo "sequence not present";
else
{
echo "<br>sequence present <br>";
$len2=count($a);
for($p=0;$p<$len2;$p++)
echo" ".$a[$p];
}

?>
3

солнечно, у меня есть хороший для вас!

Метод:

$found=false;                                              // declare default outcome
for($x=1,$max=sizeof($data); $x<=$max; ++$x){              // this allows "overlap"if(array_slice($data,0,$x)===array_slice($data,-$x)){  // compare start to end
$found=true;                                       // declare a match has occurred
}elseif($found){                                       // this iteration is no match
--$x;                                              // rewind to successful match
break;
}
}
var_export($found?array_slice($data,0,$x):"No match");      // output the result

входные & Выходы:

$data=['a','b','c','e','r','t','x','s','b','a','b','c'];  // ['a','b','c']
$data=['n','o','p','e'];                                  // No Match
$data=['r','a','c','e','c','a','r'];                      // ['r']
$data=['a','a','b','a','a'];                              // ['a','a']

Объяснение:

Более эффективно и целесообразно по возможности избегать решений на основе регулярных выражений. Кроме того, мне удалось написать решение, которое сохраняет ввод в виде массива (избегая ненужных преобразований).

array_slice() явный герой этого ответа. Как $x приращения, два array_slice() звонки остаются в синхронизации, что позволяет простое условное сравнение.

$max устанавливается для итерации всего массива и приветствует возможность «перекрытия» внутри массива. Если вы не хотите шансов «перекрытия», вы можете использовать $max=floor(sizeof($data)/2)

После того, как совпадение найдено, как только обнаружится несоответствие, цикл прервется и будет отображен правильный вывод.


Расширение вопроса …

Palindromic Matching — Вы можете легко настроить мой метод для соответствия зеркальным последовательностям, добавив array_reverse(),

Метод:

$found=false;
for($x=1,$max=sizeof($data); $x<=$max; ++$x){
if(array_slice($data,0,$x)===array_reverse(array_slice($data,-$x))){  // only change
$found=true;
}elseif($found){
--$x;
break;
}
}
var_export($found?array_slice($data,0,$x):"No match");

входные & Выходы:

$data=['a','b','c','e','r','t','x','s','b','a','b','c'];    // No Match
$data=['n','o','p','e'];                                    // No Match
$data=['r','a','c','e','c','a','r'];                        // ['r','a','c','e','c','a','r']
$data=['a','a','b','a','a'];                                // ['a','a','b','a','a']
1
По вопросам рекламы [email protected]