国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)---字典樹(Tire)

這篇具有很好參考價值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)---字典樹(Tire)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

字典樹是一種能夠快速插入和查詢字符串的多叉樹結(jié)構(gòu),節(jié)點的編號各不相同,根節(jié)點編號為0

Trie樹,即字典樹,又稱單詞查找樹或鍵樹,是一種樹形結(jié)構(gòu),是一種哈希樹的變種。

核心思想也是通過空間來換取時間上的效率

在一定情況下字典樹的效率要比哈希表要高

字典樹在解決公共前綴的使用,所以叫前綴樹

數(shù)據(jù)結(jié)構(gòu)---字典樹(Tire),哈希算法,算法

?先說如何創(chuàng)建字典樹

這個是只有26個小寫字母存放的字典樹

class TrieNode{
public:
    TrieNode* next[26];
    bool isword;
    TrieNode(){
        memset(next,NULL,sizeof(next));
        isword=false;
    }
    ~TrieNode(){
        for(int i=0;i<26;i++)if(next[i])delete next[i];
    }
};

也可以直接用c++中的特殊的數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)

struct Node {
    unordered_map<int, Node*> son;
    int cnt = 0;
};

但是在下面必須要對根節(jié)點進行補充,根節(jié)點為空

Node *root = new Node();

leetcode3043. 最長公共前綴的長度-CSDN博客

leetcode3042. 統(tǒng)計前后綴下標對 I-CSDN博客

力扣(LeetCode)官網(wǎng) - 全球極客摯愛的技術(shù)成長平臺

這道題之前用的暴力去模擬這個過程,效率太低,,采用前綴樹來解決

class Solution {
public:

    long long countPrefixSuffixPairs(vector<string>& words) {
        long long cnt=0;
        int i,j;
        for(i=0;i<words.size()-1;i++){
            for(j=i+1;j<words.size();j++){
                       if(words[j].find(words[i])==0 && words[j].rfind(words[i])==words[j].length()-words[i].length()){
                           cnt++;
                       }
            }
        }
        return cnt;
    }
};

但是前綴樹解決的是前綴的問題,這道題讓解決的是前綴和后綴的問題,所以想要把這個字符串轉(zhuǎn)變一下來解決,

【1】首先我先到的是建造兩個前綴樹,一個正向前綴樹,一個反向前綴樹

?【2】可以用一個pair去儲存步驟1的過程

正 ab? ? ? ? ? ? ? ? ? ?abcdab

反 ba? ? ? ? ? ? ? ? ? ?badcba

[(a,b),(b,a)]? ? ? ? ? ? ?[(a,b),(b,a),.....]

由此可見如果是前后綴的話,應(yīng)該會在pair列表中出現(xiàn)文章來源地址http://www.zghlxwxcb.cn/news/detail-833726.html

class Node:
    __slots__ = 'son', 'cnt'

    def __init__(self):
        self.son = dict()
        self.cnt = 0

class Solution:
    def countPrefixSuffixPairs(self, words: List[str]) -> int:
        ans = 0
        root = Node()
        for t in words:
            z = self.calc_z(t)
            cur = root
            for i, c in enumerate(t):
                if c not in cur.son:
                    cur.son[c] = Node()
                cur = cur.son[c]
                if z[-1 - i] == i + 1:  # t[-1-i:] == t[:i+1]
                    ans += cur.cnt
            cur.cnt += 1
        return ans

    def calc_z(self, s: str) -> List[int]:
        n = len(s)
        z = [0] * n
        l, r = 0, 0
        for i in range(1, n):
            if i <= r:
                z[i] = min(z[i - l], r - i + 1)
            while i + z[i] < n and s[z[i]] == s[i + z[i]]:
                l, r = i, i + z[i]
                z[i] += 1
        z[0] = n
        return z

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)---字典樹(Tire)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包