当前位置:   article > 正文

数据结构---字典树(Tire)_tire树状结构

tire树状结构

字典树是一种能够快速插入和查询字符串的多叉树结构,节点的编号各不相同,根节点编号为0

Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。

核心思想也是通过空间来换取时间上的效率

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

字典树在解决公共前缀的使用,所以叫前缀树

 先说如何创建字典树

这个是只有26个小写字母存放的字典树

  1. class TrieNode{
  2. public:
  3. TrieNode* next[26];
  4. bool isword;
  5. TrieNode(){
  6. memset(next,NULL,sizeof(next));
  7. isword=false;
  8. }
  9. ~TrieNode(){
  10. for(int i=0;i<26;i++)if(next[i])delete next[i];
  11. }
  12. };

也可以直接用c++中的特殊的数据结构来实现

  1. struct Node {
  2. unordered_map<int, Node*> son;
  3. int cnt = 0;
  4. };

但是在下面必须要对根节点进行补充,根节点为空

Node *root = new Node();

leetcode3043. 最长公共前缀的长度-CSDN博客

leetcode3042. 统计前后缀下标对 I-CSDN博客

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

这道题之前用的暴力去模拟这个过程,效率太低,,采用前缀树来解决

  1. class Solution {
  2. public:
  3. long long countPrefixSuffixPairs(vector<string>& words) {
  4. long long cnt=0;
  5. int i,j;
  6. for(i=0;i<words.size()-1;i++){
  7. for(j=i+1;j<words.size();j++){
  8. if(words[j].find(words[i])==0 && words[j].rfind(words[i])==words[j].length()-words[i].length()){
  9. cnt++;
  10. }
  11. }
  12. }
  13. return cnt;
  14. }
  15. };

但是前缀树解决的是前缀的问题,这道题让解决的是前缀和后缀的问题,所以想要把这个字符串转变一下来解决,

【1】首先我先到的是建造两个前缀树,一个正向前缀树,一个反向前缀树

 【2】可以用一个pair去储存步骤1的过程

正 ab                   abcdab

反 ba                   badcba

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

由此可见如果是前后缀的话,应该会在pair列表中出现

  1. class Node:
  2. __slots__ = 'son', 'cnt'
  3. def __init__(self):
  4. self.son = dict()
  5. self.cnt = 0
  6. class Solution:
  7. def countPrefixSuffixPairs(self, words: List[str]) -> int:
  8. ans = 0
  9. root = Node()
  10. for t in words:
  11. z = self.calc_z(t)
  12. cur = root
  13. for i, c in enumerate(t):
  14. if c not in cur.son:
  15. cur.son[c] = Node()
  16. cur = cur.son[c]
  17. if z[-1 - i] == i + 1: # t[-1-i:] == t[:i+1]
  18. ans += cur.cnt
  19. cur.cnt += 1
  20. return ans
  21. def calc_z(self, s: str) -> List[int]:
  22. n = len(s)
  23. z = [0] * n
  24. l, r = 0, 0
  25. for i in range(1, n):
  26. if i <= r:
  27. z[i] = min(z[i - l], r - i + 1)
  28. while i + z[i] < n and s[z[i]] == s[i + z[i]]:
  29. l, r = i, i + z[i]
  30. z[i] += 1
  31. z[0] = n
  32. return z
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号