📌  相关文章
📜  最长的前缀匹配– Java基于Trie的解决方案(1)

📅  最后修改于: 2023-12-03 15:26:28.732000             🧑  作者: Mango

最长的前缀匹配– Java基于Trie的解决方案

在字符串处理中,最长的前缀匹配是一个非常常见的问题。在这个问题中,我们需要查询给定字符串中最长的前缀,该前缀也是一个词在字典树(Trie)中的一个节点。在这篇文章中,我们将介绍如何使用Java语言实现一个基于Trie的数据结构来解决这个问题。

字典树(Trie)

字典树(Trie),也叫单词查找树或键树,是一种树形数据结构,用于存储字符串。它被广泛应用于统计和排序大量的字符串(如搜索引擎中的关键词提示和自动完成)。字典树的根节点不包含任何信息,每一个单词的每个字符都可以通过从根节点开始的路径来表示。每个单词的最后一个字符节点都被标记为一个单词节点。

在Java中,我们可以通过一个TrieNode类来表示字典树的节点。每个节点包含一个指向子节点的映射表,以及一个布尔变量,用于标记当前节点是否为一个单词的结束节点。

class TrieNode {
    Map<Character, TrieNode> children;
    boolean isEndOfWord;

    public TrieNode() {
        children = new HashMap<>();
        isEndOfWord = false;
    }
}

构建Trie树

我们可以通过一个Trie类来构建Trie树。该类包括一个TrieNode作为根节点,并包含以下主要方法:

  • insert(String word):该方法用于将单词插入到Trie树中。
  • search(String word):该方法用于检查Trie中是否存在单词。
  • startsWith(String prefix):该方法用于检查Trie中是否存在以给定前缀开头的单词。
  • findLongestMatchingPrefix(String word):该方法用于查找给定单词中最长的前缀匹配。
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的最长前缀匹配解决方案,希望能对你有所帮助。