Php 如何在数组末尾查找与数组开头相同的最大字符序列?

Php 如何在数组末尾查找与数组开头相同的最大字符序列?,php,arrays,duplicates,subset,array-filter,Php,Arrays,Duplicates,Subset,Array Filter,我想编写一段代码,在数组末尾查找与数组开头相同的最大字符序列 但我不知道如何用PHP实现它 例如: Input = [a,b,c,e,r,t,x,s,b,a,b,c] Output = [a,b,c] (因为元素a、b、c都位于数组的开头和结尾,它们代表了这些字符的最大序列)注意:这将非常适合这种数组,因为我们有字符串数组,但它不适用于嵌套数组 我希望这段代码能起作用: <?php $Input = array('a','b','c','e','r','t','x','s

我想编写一段代码,在数组末尾查找与数组开头相同的最大字符序列

但我不知道如何用PHP实现它

例如:

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

(因为元素
a、b、c
都位于数组的开头和结尾,它们代表了这些字符的最大序列)

注意:这将非常适合这种数组,因为我们有字符串数组,但它不适用于嵌套数组


我希望这段代码能起作用:

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

    ?>

桑妮,我有一个好的给你

方法:

$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
$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");
说明:

尽可能避免使用基于正则表达式的解决方案更有效、更可取。此外,我还设法编写了一个解决方案,使输入保持数组形式(避免不必要的转换)

array\u slice()
显然是这个答案的主角。随着
$x
的增加,两个
array\u slice()
调用保持同步,允许进行简单的条件比较

$max
设置为迭代整个数组,并欢迎数组中出现“重叠”的可能性。如果您不希望出现任何“重叠”,可以使用
$max=floor(sizeof($data)/2)

找到匹配项后,一旦存在不匹配项,循环将中断,并显示正确的输出


问题扩展…

回文匹配——通过添加
array\u reverse()
,您可以轻松地调整我上面的方法以匹配镜像序列

方法:

$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
$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']