我想編寫代碼來查找數組末尾的最大字符序列,它們與數組的開頭相同。如何查找與數組開頭相同的數組末尾的最大字符序列?
但我不知道如何用PHP做到這一點?
例如:
Input = [a,b,c,e,r,t,x,s,b,a,b,c]
Output = [a,b,c]
(因爲a,b,c
在陣列的開頭和結尾都和它們代表這樣的最大字符序列中的元素)
我想編寫代碼來查找數組末尾的最大字符序列,它們與數組的開頭相同。如何查找與數組開頭相同的數組末尾的最大字符序列?
但我不知道如何用PHP做到這一點?
例如:
Input = [a,b,c,e,r,t,x,s,b,a,b,c]
Output = [a,b,c]
(因爲a,b,c
在陣列的開頭和結尾都和它們代表這樣的最大字符序列中的元素)
注:這將工作對於這種有數組的字符串來說非常完美,它不適用於嵌套數組。
<?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);
我希望這個代碼將工作:
<?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
輸入&輸出:
$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']