实现 Trie (前缀树)【php版】

47 篇文章 1 订阅

在这里插入图片描述

<?php
class Trie {
	private $_children;
	private $_isEnd;
	/**
	 * Initialize your data structure here.
	 */
	function __construct() {
		$this->_children = [];
		$this->_isEnd = false;
	}

	/**
	 * Inserts a word into the trie.
	 * @param String $word
	 * @return NULL
	 */
	function insert($word) {
		$curNode = $this;
		for ($i=0,$len=strlen($word); $i<$len; $i++) {
			$char = $word[$i];
			if (array_key_exists($char, $curNode->_children)) {
				$curNode = $curNode->_children[$char];
			} else {
				$node = new Trie();
				$curNode->_children[$char] = $node;
				$curNode = $node;
			}
		}
		$curNode->_isEnd = true;
	}

	/**
	 * Returns if the word is in the trie.
	 * @param String $word
	 * @return Boolean
	 */
	function search($word) {
		$lastNode = $this->getLastNode($word);
		return !is_null($lastNode) && $lastNode->_isEnd == true;
	}

	private function getLastNode($word) {
		$curNode = $this;
		for ($i=0,$len=strlen($word); $i<$len; $i++) {
			$char = $word[$i];
			if (!array_key_exists($char, $curNode->_children)) {
				return null;
			}
			$curNode = $curNode->_children[$char];
		}
		return $curNode;
	}

	/**
	 * Returns if there is any word in the trie that starts with the given prefix.
	 * @param String $prefix
	 * @return Boolean
	 */
	function startsWith($prefix) {
		$lastNode = $this->getLastNode($prefix);
		return !is_null($lastNode);
	}
}

/**
 * Your Trie object will be instantiated and called as such:
 * $obj = Trie();
 * $obj->insert($word);
 * $ret_2 = $obj->search($word);
 * $ret_3 = $obj->startsWith($prefix);
 */
$obj = new Trie();
$obj->insert("abc");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值