2017-04-17 54 views

回答

3

注:這將工作對於這種有數組的字符串來說非常完美,它不適用於嵌套數組。

Try this code snippet here

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

    ?> 
1

陽光明媚,我有一個很好的爲您服務!

方法:

$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)

找到匹配後,一旦出現不匹配,循環將中斷並顯示正確的輸出。


問題擴展...

迴文匹配 - 您可以輕鬆地調整我的上述方法加入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'] 
相關問題