给定一个单词串以这样的顺序排列它们,使X -> Y -> Z
之类的单词成为X
的最后一个字符是Y
的第一个字符,并且最后一个字符为Y
Z
是"sam let mat xaml tax"
的第一个字符。
例如:
"sam mat tax xaml let"
将成为
{{1}}
答案 0 :(得分:1)
我的此算法版本会重新排列单词,但是: - 不包括那些不能形成单词链的单词(单词链起始于至少找到一个巧合的单词) - 不会重新启动另一个链,其余的单词与第一个单词链不一致。也就是说,只有一个词链
也就是说:
" ysamz让mat xaml gallery tax"
会给:
让税xaml
发生这种情况是因为它没有找到ysamz,gallery和mat的任何巧合。http://sandbox.onlinephpfunctions.com/code/7f911e410510980331627832889816997abe24db
function right($string,$chars)
{
$vright = substr($string, strlen($string)-$chars,$chars);
return $vright;
}
function left($string,$chars){
$vleft=substr($string, 0,$chars);
return $vleft;
}
function findone($str,&$strArray,$currentword)
{
$chosen="";
foreach ($strArray as $i => $strinarray)
{
if(left($strinarray,1)==$str)
{
$chosen=$strinarray;
unset($strArray[$i]);
break;
}
}
return $chosen;
}
function findonepattern($str,&$strArray,$currentword)
{
$chosen="";
$coincidences=preg_grep('/^'.$str.'.*$/', $strArray);
if(sizeof($coincidences)>0)
{
$chosen=current($coincidences);
$delWord=array_keys($strArray, $chosen);
unset($strArray[$delWord[0]]);
$strArray=array_values($strArray);
}
return $chosen;
}
function rearrange($lastvalue,&$strArray)
{
global $finalArray,$globalcount;
$last=right($lastvalue, 1);
// $chosen=findonepattern($last,$strArray,$lastvalue);
$chosen=findone($last,$strArray,$lastvalue);
if(!empty($chosen))
{
//this line is commented because if there is more than one similar word
//it would not consider the second one
// if(!in_array($chosen, $finalArray)) $finalArray[]=$chosen;
$finalArray[]=$chosen;
rearrange($chosen, $strArray);
}
if(sizeof($finalArray)==1 && $globalcount<sizeof($strArray))
{
$globalcount++;
$finalArray[0]=$strArray[$globalcount];
rearrange($finalArray[0], $strArray);
}
return $finalArray;
}
$globalcount=0;
$thestring="sam let mat xaml tax";
$strArray=explode(" ",$thestring);
$strArray=array_filter($strArray);
$finalArray=array();
$finalArray[]=$strArray[0];
unset($strArray[0]);
$finalArray=rearrange($finalArray[0],$strArray);
foreach($finalArray as $finalstr)
{
echo $finalstr." ";
}
PREG PATTERN 而不是使用使用&#34; left&#34;的findone函数,您可以使用模式但性能更差:
function findonepattern($str,&$strArray,$currentword)
{
$chosen="";
$coincidences=preg_grep('/^'.$str.'.*$/', $strArray);
if(sizeof($coincidences)>0)
{
$chosen=current($coincidences);
$delWord=array_keys($strArray, $chosen);
unset($strArray[$delWord[0]]);
$strArray=array_values($strArray);
}
return $chosen;
}
你可以在这里看到3000字的表现:
http://sandbox.onlinephpfunctions.com/code/5ae84a2dadc8140eeb1e776d74059a204877bf0a
第一个解决方案:aprox。 0.3秒 第二种解决方案(preg):aprox 1秒
答案 1 :(得分:1)
尝试递归函数:
<?php
$myStr = "sam let mat xaml tax";
var_dump($myStr);
$myStr = explode(' ', $myStr);
$finalArr = find($myStr[0], $myStr, array(), array());
$finalArr = array_unique($finalArr);
$strFinal = implode(" ", $finalArr);
var_dump($strFinal);
function find($currentWord, $myStr, $OUTPUT = array(), $unic = array()){
$indexWord = array_search($currentWord, $myStr);
$findFlag = false;
foreach($myStr as $keyInLoop=>$wordInLoop){
if(substr($currentWord, -1) == $wordInLoop[0]){
$findFlag = true;
$OUTPUT[] = $currentWord;
$OUTPUT[] = $wordInLoop;
unset($myStr[$indexWord]);
$myStr = array_values($myStr);
if(!count($myStr)) return array_merge($OUTPUT, $unic);
elseif(count($myStr) == 1) {$unic[count($OUTPUT)+count($unic)+1] = $myStr[0]; return array_merge($OUTPUT, $unic);}
else return find($wordInLoop, $myStr, $OUTPUT, $unic);
}
}
if(!$findFlag){
$unic[count($OUTPUT)+count($unic)+1] = $currentWord;
unset($myStr[$indexWord]);
$myStr = array_values($myStr);
if(!count($myStr)) return array_merge($OUTPUT, $unic);
elseif(count($myStr) == 1) {$unic[count($OUTPUT)+count($unic)+1] = $myStr[0]; return array_merge($OUTPUT, $unic);}
else return find($myStr[0], $myStr, $OUTPUT, $unic);
}
}
?>