📅  最后修改于: 2023-12-03 15:26:28.732000             🧑  作者: Mango
在字符串处理中,最长的前缀匹配是一个非常常见的问题。在这个问题中,我们需要查询给定字符串中最长的前缀,该前缀也是一个词在字典树(Trie)中的一个节点。在这篇文章中,我们将介绍如何使用Java语言实现一个基于Trie的数据结构来解决这个问题。
字典树(Trie),也叫单词查找树或键树,是一种树形数据结构,用于存储字符串。它被广泛应用于统计和排序大量的字符串(如搜索引擎中的关键词提示和自动完成)。字典树的根节点不包含任何信息,每一个单词的每个字符都可以通过从根节点开始的路径来表示。每个单词的最后一个字符节点都被标记为一个单词节点。
在Java中,我们可以通过一个TrieNode类来表示字典树的节点。每个节点包含一个指向子节点的映射表,以及一个布尔变量,用于标记当前节点是否为一个单词的结束节点。
class TrieNode {
Map<Character, TrieNode> children;
boolean isEndOfWord;
public TrieNode() {
children = new HashMap<>();
isEndOfWord = false;
}
}
我们可以通过一个Trie类来构建Trie树。该类包括一个TrieNode作为根节点,并包含以下主要方法:
class Trie {
private TrieNode root;
public Trie() {
root = new TrieNode();
}
public void insert(String word) {
TrieNode current = root;
for (char c : word.toCharArray()) {
current.children.putIfAbsent(c, new TrieNode());
current = current.children.get(c);
}
current.isEndOfWord = true;
}
public boolean search(String word) {
TrieNode current = root;
for (char c : word.toCharArray()) {
if (!current.children.containsKey(c)) {
return false;
}
current = current.children.get(c);
}
return current.isEndOfWord;
}
public boolean startsWith(String prefix) {
TrieNode current = root;
for (char c : prefix.toCharArray()) {
if (!current.children.containsKey(c)) {
return false;
}
current = current.children.get(c);
}
return true;
}
public String findLongestMatchingPrefix(String word) {
TrieNode current = root;
StringBuilder sb = new StringBuilder();
int i = 0;
while (i < word.length() && current.children.containsKey(word.charAt(i)) && !current.isEndOfWord) {
current = current.children.get(word.charAt(i));
sb.append(word.charAt(i));
i++;
}
return sb.toString();
}
}
以下是一个示例代码,用于测试我们实现的Trie类:
public class Main {
public static void main(String args[]) {
Trie trie = new Trie();
trie.insert("hello");
trie.insert("world");
trie.insert("welcome");
trie.insert("to");
trie.insert("the");
trie.insert("jungle");
System.out.println(trie.search("hello")); // true
System.out.println(trie.search("welcome")); // true
System.out.println(trie.startsWith("wor")); // true
System.out.println(trie.startsWith("wel")); // true
System.out.println(trie.startsWith("jag")); // false
System.out.println(trie.findLongestMatchingPrefix("helloworld")); // hello
System.out.println(trie.findLongestMatchingPrefix("theworld")); // the
System.out.println(trie.findLongestMatchingPrefix("welhome")); // wel
}
}
输出结果:
true
true
true
true
false
hello
the
wel
以上就是本文介绍的基于Java Trie的最长前缀匹配解决方案,希望能对你有所帮助。