1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| <?php
class TrieNode { public $data; public $children = []; public $isEndingChar = false;
public function __construct($data) { $this->data = $data; } }
class Tire { private $root;
public function __construct() { $this->root = new TrieNode('_'); //根节点 }
public function getRoot() { return $this->root; }
public function insert($text) { $p = $this->root; for ($i = 0; $i < mb_strlen($text); $i++) { $index = $data = $text[$i];
if (empty($p->children[$index])) { $newNode = new TrieNode($data); $p->children[$index] = $newNode; } $p = $p->children[$index]; } $p->isEndingChar = true; }
public function find($pattern) { $p = $this->root; for ($i = 0; $i < mb_strlen($pattern); $i++) { $index = $data = $pattern[$i];
if (empty($p->children[$index])) { return false; } $p = $p->children[$index]; } if ($p->isEndingChar == false) { return false; } return true; } }
$trie = new Tire(); // 创建 $strings = ['b', 'abc', 'abd', 'bcd', 'abcd', 'efg', 'hii']; foreach ($strings as $str) { $trie->insert($str); }
// 搜索 if ($trie->find('bcd')) { print "包含这个字符串\n"; } else { print "不包含这个字符串\n"; } var_dump(json_encode(json_decode(json_encode($trie->getRoot()), true)));
|