📜  计算Trie中的单词数

📅  最后修改于: 2021-04-17 09:35:41             🧑  作者: Mango

Trie用于存储字典单词,以便可以有效地搜索它们并可以进行前缀搜索。任务是编写一个函数来计算单词数。

例子 :

Input :     root
          /   \    \
         t   a     b
         |   |     |
         h   n     y
         |   |  \  |
         e   s  y  e
         /  |   |
         i  r   w
         |  |   |
         r  e   e
                |
                r
Output : 8
Explanation : Words formed in the Trie : 
"the", "a", "there", "answer", "any", "by", 
"bye", "their".

在Trie结构中,我们有一个字段来存储单词标记的末尾,在下面的实现中我们将其称为isLeaf。要计算单词数,我们只需要遍历Trie并计算设置了isLeaf的所有节点。

C++
// C++ implementation to count words in a trie
#include 
using namespace std;
   
#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])
   
// Alphabet size (# of symbols)
#define ALPHABET_SIZE (26)
   
// Converts key current character into index
// use only 'a' through 'z' and lower case
#define CHAR_TO_INDEX(c) ((int)c - (int)'a')
  
// Trie node
struct TrieNode
{
    struct TrieNode *children[ALPHABET_SIZE];
   
    // isLeaf is true if the node represents
    // end of a word
    bool isLeaf;
};
   
// Returns new trie node (initialized to NULLs)
struct TrieNode *getNode(void)
{
    struct TrieNode *pNode = new TrieNode;
        pNode->isLeaf = false;
   
    for (int i = 0; i < ALPHABET_SIZE; i++)
        pNode->children[i] = NULL;    
   
    return pNode;
}
   
// If not present, inserts key into trie
// If the key is prefix of trie node, just
// marks leaf node
void insert(struct TrieNode *root, const char *key)
{
    int length = strlen(key);
  
    struct TrieNode *pCrawl = root;
   
    for (int level = 0; level < length; level++)
    {
        int index = CHAR_TO_INDEX(key[level]);
        if (!pCrawl->children[index])
            pCrawl->children[index] = getNode();
   
        pCrawl = pCrawl->children[index];
    }
   
    // mark last node as leaf
    pCrawl->isLeaf = true;
}
  
// Function to count number of words
int wordCount(struct TrieNode *root)
{
    int result = 0;
  
    // Leaf denotes end of a word
    if (root -> isLeaf)
        result++;
      
    for (int i = 0; i < ALPHABET_SIZE; i++)    
      if (root -> children[i])
         result += wordCount(root -> children[i]);
     
    return result;   
}
  
// Driver
int main()
{
    // Input keys (use only 'a' through 'z' 
    // and lower case)
    char keys[][8] = {"the", "a", "there", "answer", 
                     "any", "by", "bye", "their"};
  
   
    struct TrieNode *root = getNode();
   
    // Construct Trie
    for (int i = 0; i < ARRAY_SIZE(keys); i++)
        insert(root, keys[i]);
  
    cout << wordCount(root);
      
    return 0;
}


Java
// Java implementation to count words in a trie
public class Words_in_trie {
      
    // Alphabet size (# of symbols)
    static final int ALPHABET_SIZE = 26;
       
    // Trie node
    static class TrieNode
    {
        TrieNode[] children =  new TrieNode[ALPHABET_SIZE];
        // isLeaf is true if the node represents
        // end of a word
        boolean isLeaf;
          
        TrieNode(){
            isLeaf = false;
            for (int i = 0; i < ALPHABET_SIZE; i++)
                 children[i] = null; 
        }
    };
    static TrieNode root;
        
    // If not present, inserts key into trie
    // If the key is prefix of trie node, just
    // marks leaf node
    static void insert(String key)
    {
        int length = key.length();
       
        TrieNode pCrawl = root;
        
        for (int level = 0; level < length; level++)
        {
            int index = key.charAt(level) - 'a';
            if (pCrawl.children[index] == null)
                pCrawl.children[index] = new TrieNode();
        
            pCrawl = pCrawl.children[index];
        }
        
        // mark last node as leaf
        pCrawl.isLeaf = true;
    }
       
    // Function to count number of words
    static int wordCount(TrieNode root)
    {
        int result = 0;
       
        // Leaf denotes end of a word
        if (root.isLeaf)
            result++;
           
        for (int i = 0; i < ALPHABET_SIZE; i++)    
          if (root.children[i] != null )
             result += wordCount(root.children[i]);
          
        return result;   
    }
       
    // Driver Program
    public static void main(String args[])
    {
        // Input keys (use only 'a' through 'z' 
        // and lower case)
        String keys[] = {"the", "a", "there", "answer", 
                        "any", "by", "bye", "their"};
  
        root = new TrieNode();      
          
        // Construct Trie
        for (int i = 0; i < keys.length; i++)
            insert(keys[i]);
       
        System.out.println(wordCount(root)); 
    }
}
// This code is contributed by Sumit Ghosh


C#
// C# implementation to count words in a trie 
using System;
  
public class Words_in_trie 
{ 
      
    // Alphabet size (# of symbols) 
    static readonly int ALPHABET_SIZE = 26; 
      
    // Trie node 
    public class TrieNode 
    { 
        public TrieNode[] children = new TrieNode[ALPHABET_SIZE]; 
          
        // isLeaf is true if the node represents 
        // end of a word 
        public bool isLeaf; 
          
        public TrieNode()
        { 
            isLeaf = false; 
            for (int i = 0; i < ALPHABET_SIZE; i++) 
                children[i] = null; 
        } 
    }; 
    static TrieNode root; 
          
    // If not present, inserts key into trie 
    // If the key is prefix of trie node, just 
    // marks leaf node 
    static void insert(String key) 
    { 
        int length = key.Length; 
      
        TrieNode pCrawl = root; 
          
        for (int level = 0; level < length; level++) 
        { 
            int index = key[level] - 'a'; 
            if (pCrawl.children[index] == null) 
                pCrawl.children[index] = new TrieNode(); 
          
            pCrawl = pCrawl.children[index]; 
        } 
          
        // mark last node as leaf 
        pCrawl.isLeaf = true; 
    } 
      
    // Function to count number of words 
    static int wordCount(TrieNode root) 
    { 
        int result = 0; 
      
        // Leaf denotes end of a word 
        if (root.isLeaf) 
            result++; 
          
        for (int i = 0; i < ALPHABET_SIZE; i++) 
        if (root.children[i] != null ) 
            result += wordCount(root.children[i]); 
          
        return result; 
    } 
      
    // Driver code 
    public static void Main() 
    { 
        // Input keys (use only 'a' through 'z' 
        // and lower case) 
        String []keys = {"the", "a", "there", "answer", 
                        "any", "by", "bye", "their"}; 
  
        root = new TrieNode(); 
          
        // Construct Trie 
        for (int i = 0; i < keys.Length; i++) 
            insert(keys[i]); 
      
        Console.WriteLine(wordCount(root)); 
    } 
} 
  
/* This code contributed by PrinciRaj1992 */


输出:

8