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);
文字均为博主原创,转载请联系博主,谢谢!