Leetcode 單雙字典樹

2021-10-10 01:42:04 字數 1256 閱讀 6692

有n個只包含小寫字母的串s1​,s2​,..sn​,每次給你乙個只包含小寫字母的串t。如果串s存在字首s',它的奇數字的字元與t的奇數字字元完全相同,稱s為t的單匹配串,如果串s的偶數字字元與t的偶數字的字元全都相同,稱s為t的雙匹配串。

現在給你m個字串,對於每個字串t,求s1​,s2​,...sn​中有多少個串是t的單匹配串但不是t的雙匹配串。

示例1複製

3,["abc", "bbc", "cbd"],3,["abc","cad","bac"]
複製

[0,1,1]
對於字串"abc"。沒有滿足條件的單匹配串

字串「cad"有滿足條件的串: "cbd" ,第乙個位置都是c,第三個位置都是d,是單匹配串,但是第二個位置不同,不是雙匹配串

字串"bac"有滿足條件的串: "bbc" ,第乙個位置都是b,第三個位置都是c,是單匹配串,但是第二個位置不同,不是雙匹配串

【思路】

針對字首數量統計問題,通常採取字典樹trie解決。

字典樹每個節點包含乙個 next[26]陣列  其中next[k]指向 第k個字元所在的節點位置(可能採取指標勾連,也可能是陣列下標)

字典樹主要操作:

本題要求,在字典中滿足,和t的奇數字匹配,但不和t的偶數字匹配的單詞數量。

基本思路,構建兩顆字典樹

那麼對於乙個單詞t   通過查詢:

那麼可以知道: a>=b

完整匹配=奇數字匹配+偶數字匹配

因為乙個單詞t若是能在完整單詞字典樹中有字首匹配(那麼對應奇數字一定匹配) 那麼在奇數字單詞字典樹中一定有對應的字首匹配,因此滿足奇數字字首匹配同時偶數字字首不匹配的總數為:a-b

class trie   //字典樹

;//其中next[i][j]=k 表示字典樹i節點的第j條走向的點 指向k

int sum[500000]=;//sum[i]=k 表示以i節點為末尾的 單詞出現的數量

int pre[500000]=;//pre[i]=k 表示以i節點之前路徑 為字首的單詞數量

int num=1;//表示節點的數量

public:

void add_word(string word) //插入乙個單詞

};class solution

return ans;

}};

字典樹leetcode習題

給出乙個字串陣列words組成的一本英語詞典。從中找出最長的乙個單詞,該單詞是由words詞典中其他單詞逐步新增乙個字母組成。若其中有多個可行的答案,則返回答案中字典序最小的單詞。若無答案,則返回空字串。例項 輸入 words w wo wor worl world 輸出 world 解釋 單詞 w...

字典樹 leetcode 527 單詞縮寫

給定乙個由n個不重複非空字串組成的陣列,你需要按照以下規則為每個單詞生成最小的縮寫。初始縮寫由起始字母 省略字母的數量 結尾字母組成。若存在衝突,亦即多於乙個單詞有同樣的縮寫,則使用更長的字首代替首字母,直到從單詞到縮寫的對映唯一。換而言之,最終的縮寫必須只能對映到乙個單詞。若縮寫並不比原單詞更短,...

LeetCode字典樹 820單詞的壓縮編碼

給定乙個單詞列表,我們將這個列表編碼成乙個索引字串 s 與乙個索引列表 a。例如,如果這個列表是 time me bell 我們就可以將其表示為 s time bell 和 indexes 0,2,5 對於每乙個索引,我們可以通過從字串 s 中索引的位置開始讀取字串,直到 結束,來恢復我們之前的單詞...