php 求解最长公共前缀(字典树)
leetcode 题解
<?php
class Solution
{
/**
* @param String[] $strs
* @return String
*/
public function longestCommonPrefix($strs)
{
if (empty($strs)) {
return "";
}
foreach ($strs as $value) {
if(empty($value)){
return "";
}
}
if(!isset($strs[1])){
return $strs[0];
}
$head = new Node();
foreach ($strs as $str) {
// 加入字典树
$this->addString($head, $str);
}
// 获取公共最长前缀
$a = $this->getMaxComPrex($head);
return $a;
}
/* 获取所有字符串--递归 */
public function getMaxComPrex($node, $str_array = array(), $str = '')
{
if (count($node->childNode)>1) {
return $str;
} else {
foreach ($node->childNode as $k => $v) {
if ($v->is_end == true) {
return $str. $v->value;
}
$str = $this->getMaxComPrex($v, $str_array, $str . $v->value);
}
return $str;
}
}
/* 添加字符串 */
public function addString(&$head, $str)
{
$node = null;
for ($i=0; $i < strlen($str); $i++) {
if ($str[$i] != '') {
$is_end = $i != (strlen($str) - 1) ? false : true;
if ($i == 0) {
$node = $head->addChildNode($str[$i], $is_end);
} else {
$node = $node->addChildNode($str[$i], $is_end);
}
}
}
}
}
class Node
{
public $value;
public $is_end=false;
public $childNode;
public function addChildNode($value, $is_end=false)
{
$node = $this->searchChildNode($value, $is_end);
if (empty($node)) {
// 不存在节点,添加为子节点
$node = new Node();
$node->value = $value;
$this->childNode[] = $node;
}
if($node->is_end==false){
$node->is_end = $is_end;
}
return $node;
}
/* 查询子节点 */
public function searchChildNode($value)
{
foreach ($this->childNode as $k => $v) {
if ($v->value == $value) {
// 存在节点,返回该节点
return $this->childNode[$k];
}
}
}
}
$k = ["aaa","aa","aaa"];
//$k = ["ab","a"];
$s = new Solution();
$s->longestCommonPrefix($k);
文字均为博主原创,转载请联系博主,谢谢!

浙公网安备 33010602011771号