中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么實現前綴樹

發布時間:2023-04-27 10:21:01 來源:億速云 閱讀:99 作者:iii 欄目:開發技術

本篇內容介紹了“Java怎么實現前綴樹”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

一.前綴樹

1.什么是前綴樹

字典樹(Trie樹)是一種樹形數據結構,常用于字符串的存儲和查找。字典樹的核心思想是利用字符串之間的公共前綴來節省存儲空間和提高查詢效率。它是一棵多叉樹,每個節點代表一個字符串的前綴,從根節點到葉子節點的路徑組成一個字符串。

字典樹的根節點不包含字符,每個子節點代表一個字符,從根節點到任意一個節點所經過的路徑上的字符連接起來即為該節點所代表的字符串。每個節點可以存儲一個或多個字符串,通常使用一個標志來標記一個節點代表的字符串是否存在。當需要在一組字符串中查找某個字符串時,可以利用字典樹來實現高效的查找操作。

2.前綴樹的舉例

例如對字符串數組{"goog","google","bai","baidu","a"}建立前綴樹,此時我們可以很清晰的看到前綴樹的一些特征:

  • 根結點不保存字符

  • 前綴樹是一顆多叉樹

  • 前綴樹的每個節點保存一個字符

  • 具有相同前綴的字符串保存在同一條路徑上

  • 字符串的尾處相應的在前綴樹上也有結束的標志

Java怎么實現前綴樹

二.前綴樹的實現

力扣上的208題就是實現前綴樹:力扣

1.前綴樹的數據結構

在寫代碼的時候,我偏向于用哈希表來存儲結點的信息,有的也可以用數組來存儲結點的信息,本質上都是一樣的

public class Trie {
    Map<Character, Trie> next;
    boolean isEnd;
    public Trie() {
        this.next = new HashMap<>();
        this.isEnd = false;
    }
    public void insert(String word) {
    }
    public boolean search(String word) {
        return false;
    }
    public boolean startsWith(String prefix) {
        return false;
    }
}

2.插入字符串

    public void insert(String word) {
        Trie trie = this;//獲得根結點
        for (char c : word.toCharArray()) {
            if (trie.next.get(c) == null) {//當前結點不存在
                trie.next.put(c, new Trie());//創建當前結點
            }
            trie = trie.next.get(c);//得到字符c的結點,繼續向下遍歷
        }
        trie.isEnd = true;
    }

3.查找字符串

    public boolean search(String word) {
        Trie trie = this;//獲得根結點
        for (char c : word.toCharArray()) {
            if (trie.next.get(c) == null) {//當前結點不存在
                return false;
            }
            trie = trie.next.get(c);//得到字符c的結點,繼續向下遍歷
        }
        return trie.isEnd;
    }

4.查找前綴

    public boolean startsWith(String prefix) {
        Trie trie = this;//獲得根結點
        for (char c : prefix.toCharArray()) {
            if (trie.next.get(c) == null) {//當前結點不存在
                return false;
            }
            trie = trie.next.get(c);//得到字符c的結點,繼續向下遍歷
        }
        return true;
    }

接下來是力扣上關于前綴樹的一些題目

三.詞典中最長的單詞

1.題目描述

給出一個字符串數組words 組成的一本英語詞典。返回words 中最長的一個單詞,該單詞是由words詞典中其他單詞逐步添加一個字母組成。

若其中有多個可行的答案,則返回答案中字典序最小的單詞。若無答案,則返回空字符串。

力扣:力扣

2.問題分析

這是一道典型的前綴樹的問題,但是這一題有一些特殊的要求,返回的答案是:

1.最長的單詞

2.這個單詞由其他單詞逐步構成

3.長度相同返回字典序小的

因此我們需要對前綴樹的相關代碼進行修改,把字符串一一插入的代碼還是不改變的,主要修改的是查找的代碼,應該在 trie.next.get(c) == null在增加一個判斷為false的條件,就是每一個結點都應該有一個標志true,表示每個節點都存在一個單詞,最終一步步構成最長的單詞(葉子結點的單詞)

3.代碼實現

class Solution {
    public String longestWord(String[] words) {
        Trie trie = new Trie();
        for (String word : words) {
            trie.insert(word);
        }
        String longest = "";
        for (String word : words) {
            if (trie.search(word)) {
                if (word.length() > longest.length() || ((word.length() == longest.length()) && (word.compareTo(longest) < 0))) {
                    longest = word;
                }
            }
        }
        return longest;
    }
}
class Trie {
    Map<Character, Trie> next;
    boolean isEnd;
    public Trie() {
        this.next = new HashMap<>();
        this.isEnd = false;
    }
    public void insert(String word) {
        Trie trie = this;//獲得根結點
        for (char c : word.toCharArray()) {
            if (trie.next.get(c) == null) {//當前結點不存在
                trie.next.put(c, new Trie());//創建當前結點
            }
            trie = trie.next.get(c);//得到字符c的結點,繼續向下遍歷
        }
        trie.isEnd = true;
    }
    public boolean search(String word) {
        Trie trie = this;//獲得根結點
        for (char c : word.toCharArray()) {
            if (trie.next.get(c) == null || !trie.next.get(c).isEnd) {//當前結點不存在
                return false;
            }
            trie = trie.next.get(c);//得到字符c的結點,繼續向下遍歷
        }
        return trie.isEnd;
    }
}

“Java怎么實現前綴樹”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安龙县| 福建省| 峨边| 博罗县| 泸溪县| 柘城县| 宜丰县| 星子县| 皮山县| 荥阳市| 张家川| 庆阳市| 仁化县| 青河县| 诸暨市| 从化市| 兴海县| 邢台市| 通州市| 乐昌市| 咸丰县| 鹤壁市| 云南省| 隆昌县| 巫溪县| 荆门市| 三门县| 沈阳市| 财经| 贡嘎县| 红河县| 长寿区| 上蔡县| 伊川县| 大化| 崇州市| 新巴尔虎右旗| 彰化县| 枣庄市| 正蓝旗| 岳阳县|