【原创】求出数组中单词最长公有前缀

【原创】求出数组中单词最长公有前缀

面试题目: 有数组如下,array(china,chinese,children,child,chinajoy,chrome……),求出最长公有前缀,例如这个数组的最长公有前缀为ch,而不是c,请写出对应的执行程序。

解题方案:可以以第一个单词为参照,对后面的单词进行判断【面试题非原创,方案为原创】

$arr = array(‘china’,‘chinese’,‘children’,‘child’,‘chinajoy’,‘chrome’);
$total = count($arr);  // 总的数量
// 求出最大公共前缀,解题思路是可以按照第一个单词来走,不区分大小写
$first = $arr[0];
// 首先,列出所有公共前缀的可能
$poss  = array();
for($i=1; $i<=strlen($first); $i++){
    $poss[] = substr($first, 0, $i);
}
$new   = array();
// 逐一进行判断
foreach($arr as $key=>$val){
    foreach($poss as $k=>$v){
        $res = stripos($val, $v);
        if($res === 0){
            if(isset($new[$v])){
                $new[$v] = $new[$v]+1;
            }else{
                $new[$v] = 1;
            }
        }
    }
}
// 去掉非公共的数据
foreach($new as $key=>$val){
    if($val != $total){  // 不等于总的数量,说明就不是公共前缀
        unset($new[$key]);
    }
}
if(count($new) == 1){
    var_dump(key($new));  // 显示所对应的key值 ch
}else{
    $last = array_slice($new,count($new)-1,1);  // 获取最后一个
    var_dump(key($last)); // 显示所对应的key值 ch
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据