【LeetCode】前缀树 trie(共14题)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica }

【208】Implement Trie (Prefix Tree) (2018年11月27日)

实现基本的 trie 树,包括 insert, search, startWith 操作等 api。

题解:《程序员代码面试指南》chp5, 最后一题。 里面讲了怎么实现。这个就看代码吧。没啥好说的了。

 1 class Trie {
 2 public:
 3     /** Initialize your data structure here. */
 4     Trie() {
 5         root = new TrieNode();
 6     }
 7
 8     /** Inserts a word into the trie. */
 9     void insert(string word) {
10         if (word.empty()) {return;}
11         const int n = word.size();
12         TrieNode* node = root;
13         int index = 0;
14         for (int i = 0; i < n; ++i) {
15             index = word[i] - ‘a‘;
16             if (node->mp.find(index) == node->mp.end()) {
17                 node->mp[index] = new TrieNode();
18             }
19             node = node->mp[index];
20             node->path++;
21         }
22         node->end++;
23     }
24
25     /** Returns if the word is in the trie. */
26     bool search(string word) {
27         if (word.empty()) {return false;}
28         TrieNode* node = root;
29         const int n = word.size();
30         int index = 0;
31         for (int i = 0; i < n; ++i) {
32             index = word[i] - ‘a‘;
33             if (node->mp.find(index) == node->mp.end()) {
34                 return false;
35             }
36             node = node->mp[index];
37             if (node->path == 0) {
38                 return false;
39             }
40         }
41         return node->end >= 1;
42     }
43
44     /** Returns if there is any word in the trie that starts with the given prefix. */
45     bool startsWith(string prefix) {
46         if (prefix.empty()) {return false;}
47         const int n = prefix.size();
48         TrieNode* node = root;
49         int index = 0;
50         for (int i = 0; i < n; ++i) {
51             index = prefix[i] - ‘a‘;
52             if (node->mp.find(index) == node->mp.end()) {
53                 return false;
54             }
55             node = node->mp[index];
56             if (node->path == 0) {
57                 return false;
58             }
59         }
60         return node->path >= 1;
61     }
62
63     //define trie node
64     struct TrieNode{
65         int path;  //代表多少个单词共用这个结点
66         int end;  //代表多少个单词以这个结点结尾
67         map<int, TrieNode*> mp;
68         TrieNode() {
69             path = 0, end = 0;
70         }
71     };
72     TrieNode* root;
73 };
74
75 /**
76  * Your Trie object will be instantiated and called as such:
77  * Trie obj = new Trie();
78  * obj.insert(word);
79  * bool param_2 = obj.search(word);
80  * bool param_3 = obj.startsWith(prefix);
81  */

【211】Add and Search Word - Data structure design

【212】Word Search II

【336】Palindrome Pairs

【421】Maximum XOR of Two Numbers in an Array

【425】Word Squares

【472】Concatenated Words

【642】Design Search Autocomplete System

【648】Replace Words

【676】Implement Magic Dictionary

【677】Map Sum Pairs

【692】Top K Frequent Words

【720】Longest Word in Dictionary

【745】Prefix and Suffix Search

原文地址:https://www.cnblogs.com/zhangwanying/p/9964323.html

时间: 2024-10-03 03:10:56

【LeetCode】前缀树 trie(共14题)的相关文章

【LeetCode】树(共94题)

[94]Binary Tree Inorder Traversal [95]Unique Binary Search Trees II (2018年11月14日,算法群) 给了一个 n,返回结点是 1 - n 的所有形态的BST. 题解:枚举每个根节点 r, 然后递归的生成左右子树的所有集合,然后做笛卡尔积. 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *

【暑假】[实用数据结构]前缀树 Trie

前缀树Trie Trie可理解为一个能够快速插入与查询的集合,无论是插入还是查询所需时间都为O(m) 模板如下: 1 const int maxnode = 1000+10; 2 const int sigma_size = 26; 3 4 struct Trie{ 5 int ch[maxnode][sigma_size]; 6 int val[maxnode]; 7 int sz; 8 9 void clear(){ sz=1; memset(ch[0],0,sizeof(ch[0]));

UVa 11732 &quot;strcmp()&quot; Anyone? (左儿子右兄弟前缀树Trie)

题意:给定strcmp函数,输入n个字符串,让你用给定的strcmp函数判断字符比较了多少次. 析:题意不理解的可以阅读原题https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2832 字符串很多,又很长,如果按照题目的意思两两比较,肯定会TLE,所以要用前缀树(Trie)来解决,当然只是用简单的前缀树也会TLE的, 我们必须对其进行优化,看了

【LeetCode】二叉查找树 binary search tree(共14题)

链接:https://leetcode.com/tag/binary-search-tree/ p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [220]Contains Duplicate III [315]Count of Smaller Numbers After Self [327]Count of Range Sum [352]Data Stream as Disjoint Intervals [493]

【LeetCode】BFS(共43题)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [101]Symmetric Tree 判断一棵树是不是对称. 题解:直接递归判断了,感觉和bfs没有什么强联系,当然如果你一定要用queue改写的话,勉强也能算bfs. // 这个题目的重点是 比较对象是 左子树的左儿子和右子树的右儿子, 左子树的右儿子和右子树的左儿子.不要搞错. // 直接中序遍历的话会有错的情况,最蠢的情况是数字标注改一改.. 1 /** 2

【LeetCode】数学(共106题)

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica } [2]Add Two Numbers [7]Reverse Integer [8]String to Integer (atoi) [9]Palindrome Number [12]Integer to Roman [13]Roman to Integer [29]Divide Two Integers [43]Multiply Strings [50]Pow(x,

【数据结构】前缀树/字典树/Trie

[前缀树] 用来保存一个映射(通常情况下 key 为字符串  value 为字符串所代表的信息) 例如:一个单词集合 words = {  apple, cat,  water  }   其中 key 为单词      value 代表该单词是否存在 words[ 'apple' ] = 存在     而     word[ ' abc' ] = 不存在 图示:一个保存了8个键的trie结构,"A", "to", "tea", "ted

leetcode 208. 实现 Trie (前缀树)

实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作. 示例: Trie trie = new Trie(); trie.insert("apple"); trie.search("apple"); // 返回 true trie.search("app"); // 返回 false trie.startsWith("app"); // 返回 true trie.inser

第15个算法-实现 Trie (前缀树)(LeetCode)

解法代码来源 :https://blog.csdn.net/whdAlive/article/details/81084793 算法来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/implement-trie-prefix-tree 实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作. 示例: Trie trie = new Trie(); trie.insert("apple"