您的位置:首页 > 其它

[LeetCode]Implement Trie(Prefix Tree),解题报告

2015-05-15 14:12 387 查看

目录

目录

概述

Trie树基本实现
定义Trie树节点

添加操作

查询word是否在Trie树中

AC完整代码

概述

Trie树,又称为字典树、单词查找树或者前缀树,是一种用于快速检索的多叉数结构。例如,英文字母的字典树是26叉数,数字的字典树是10叉树。

Trie树的基本性质有三点,归纳为:

根节点不包含字符,根节点外每一个节点都只包含一个字符。

从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。

每个节点的所有子节点包含的字符串不相同。

Trie树基本实现

我们通过LeetCode的上的一道Trie题目来描述Trie树的实现。Implement Trie(Prefix Tree)

定义Trie树节点

class TrieNode {
boolean isWord;
HashMap<Character, TrieNode> nexts;

public TrieNode() {
nexts = new HashMap<Character, TrieNode>();
}
}


添加操作

我们向Trie树中添加一个字符串word,具体步骤如下:

// Inserts a word into the trie.
public void insert(String word) {
char[] s = word.toCharArray();

TrieNode p = root;
int i = 0, n = s.length;

// traverse existing
while (i < n) {
TrieNode next = p.nexts.get(s[i]);
if (next != null) {
p = next;
i ++;
} else {
break;
}
}

// append new nodes
while (i < n) {
TrieNode newTrie = new TrieNode();
p.nexts.put(s[i], newTrie);
p = newTrie;
i ++;
}

// set word end
p.isWord = true;
}


查询word是否在Trie树中

// Returns if the word is in the trie.
public boolean search(String word) {
TrieNode p = root;

for (int i = 0; i < word.length(); i ++) {
TrieNode child = p.nexts.get(word.charAt(i));
if (child == null) {
return false;
}
p = child;
}

return p.isWord;
}

// Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix) {
TrieNode p = root;

for (int i = 0; i < prefix.length(); i ++) {
TrieNode child = p.nexts.get(prefix.charAt(i));
if (child == null) {
return false;
}
p = child;
}

return true;
}


AC完整代码

import java.util.HashMap;

class TrieNode { boolean isWord; HashMap<Character, TrieNode> nexts; public TrieNode() { nexts = new HashMap<Character, TrieNode>(); } }

public class Trie {
private TrieNode root;

public Trie() {
root = new TrieNode();
}

// Inserts a word into the trie.
public void insert(String word) {
char[] s = word.toCharArray();

TrieNode p = root;
int i = 0, n = s.length;

// traverse existing
while (i < n) {
TrieNode next = p.nexts.get(s[i]);
if (next != null) {
p = next;
i ++;
} else {
break;
}
}

// append new nodes
while (i < n) {
TrieNode newTrie = new TrieNode();
p.nexts.put(s[i], newTrie);
p = newTrie;
i ++;
}

// set word end
p.isWord = true;
}

// Returns if the word is in the trie.
public boolean search(String word) {
TrieNode p = root;

for (int i = 0; i < word.length(); i ++) {
TrieNode child = p.nexts.get(word.charAt(i));
if (child == null) {
return false;
}
p = child;
}

return p.isWord;
}

// Returns if there is any word in the trie
// that starts with the given prefix.
public boolean startsWith(String prefix) {
TrieNode p = root;

for (int i = 0; i < prefix.length(); i ++) {
TrieNode child = p.nexts.get(prefix.charAt(i));
if (child == null) {
return false;
}
p = child;
}

return true;
}

public static void main(String[] args) {
Trie trie = new Trie();
trie.insert("keydsdsds");
System.out.println(trie.startsWith("key"));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode