📜  在CamelCase表示法字典中打印与模式匹配的所有单词

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

给定一个单词词典,其中每个单词都遵循CamelCase表示法,请打印该词典中与给定模式匹配的所有单词,这些模式仅由大写字符组成。

CamelCase是写复合词或短语的一种做法,以使每个词或缩写都以大写字母开头。常见示例包括:“ PowerPoint”和“ WikiPedia”,“ GeeksForGeeks”,“ CodeBlocks”等。

例子:

Input: 
dict[] = ["Hi", "Hello", "HelloWorld",  "HiTech", "HiGeek", 
"HiTechWorld", "HiTechCity", "HiTechLab"]

For pattern "HT",
Output: ["HiTech", "HiTechWorld", "HiTechCity", "HiTechLab"]

For pattern "H",
Output: ["Hi", "Hello", "HelloWorld",  "HiTech", "HiGeek", 
    "HiTechWorld", "HiTechCity", "HiTechLab"]

For pattern "HTC",
Output: ["HiTechCity"]


Input: 
dict[] = ["WelcomeGeek","WelcomeToGeeksForGeeks", "GeeksForGeeks"]

For pattern "WTG",
Output: ["WelcomeToGeeksForGeeks"]

For pattern "GFG",
Output: [GeeksForGeeks]

For pattern "GG",
Output: No match found

这个想法是将所有字典键一个一个地插入到Trie中。此处的键仅指CamelCase表示法中原始单词的大写字符。如果是第一次遇到该键,则需要将最后一个节点标记为叶节点,并将该键的完整单词插入与叶节点关联的向量中。如果遇到已经在特里树中的键,则使用当前单词更新与叶节点关联的向量。处理完所有词典单词后,我们在特里树中搜索模式并打印与该模式匹配的所有单词。

以下是上述想法的实现–

C++
// C++ program to print all words in the CamelCase
// dictionary that matches with a given pattern
#include 
using namespace std;
  
// Alphabet size (# of upper-Case characters)
#define ALPHABET_SIZE 26
  
// A Trie node
struct TrieNode
{
    TrieNode* children[ALPHABET_SIZE];
  
    // isLeaf is true if the node represents
    // end of a word
    bool isLeaf;
  
    // vector to store list of complete words
    // in leaf node
    list word;
};
  
// Returns new Trie node (initialized to NULLs)
TrieNode* getNewTrieNode(void)
{
    TrieNode* pNode = new TrieNode;
  
    if (pNode)
    {
        pNode->isLeaf = false;
  
        for (int i = 0; i < ALPHABET_SIZE; i++)
            pNode->children[i] = NULL;
    }
  
    return pNode;
}
  
// Function to insert word into the Trie
void insert(TrieNode* root, string word)
{
    int index;
    TrieNode* pCrawl = root;
  
    for (int level = 0; level < word.length(); level++)
    {
        // consider only uppercase characters
        if (islower(word[level]))
            continue;
  
        // get current character position
        index = int(word[level]) - 'A';
        if (!pCrawl->children[index])
            pCrawl->children[index] = getNewTrieNode();
  
        pCrawl = pCrawl->children[index];
    }
  
    // mark last node as leaf
    pCrawl->isLeaf = true;
  
    // push word into vector associated with leaf node
    (pCrawl->word).push_back(word);
}
  
// Function to print all children of Trie node root
void printAllWords(TrieNode* root)
{
    // if current node is leaf
    if (root->isLeaf)
    {
        for(string str : root->word)
            cout << str << endl;
    }
  
    // recurse for all children of root node
    for (int i = 0; i < ALPHABET_SIZE; i++)
    {
        TrieNode* child = root->children[i];
        if (child)
            printAllWords(child);
    }
}
  
// search for pattern in Trie and print all words
// matching that pattern
bool search(TrieNode* root, string pattern)
{
    int index;
    TrieNode* pCrawl = root;
  
    for (int level = 0; level < pattern.length(); level++)
    {
        index = int(pattern[level]) - 'A';
        // Invalid pattern
        if (!pCrawl->children[index])
            return false;
  
        pCrawl = pCrawl->children[index];
    }
  
    // print all words matching that pattern
    printAllWords(pCrawl);
  
    return true;
}
  
// Main function to print all words in the CamelCase
// dictionary that matches with a given pattern
void findAllWords(vector dict, string pattern)
{
    // construct Trie root node
    TrieNode* root = getNewTrieNode();
  
    // Construct Trie from given dict
    for (string word : dict)
        insert(root, word);
  
    // search for pattern in Trie
    if (!search(root, pattern))
        cout << "No match found";
}
  
// Driver function
int main()
{
    // dictionary of words where each word follows
    // CamelCase notation
    vector dict = {
        "Hi", "Hello", "HelloWorld", "HiTech", "HiGeek",
        "HiTechWorld", "HiTechCity", "HiTechLab"
    };
  
    // pattern consisting of uppercase characters only
    string pattern = "HT";
  
    findAllWords(dict, pattern);
  
    return 0;
}


Java
// Java program to print all words in the CamelCase
// dictionary that matches with a given pattern
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class CamelCase {
  
    // Alphabet size (# of upper-Case characters)
    static final int ALPHABET_SIZE = 26;
  
    // A Trie node
    static class TrieNode {
        TrieNode[] children = new TrieNode[ALPHABET_SIZE];
  
        // isLeaf is true if the node represents
        // end of a word
        boolean isLeaf;
  
        // vector to store list of complete words
        // in leaf node
        List word;
  
        public TrieNode() {
            isLeaf = false;
            for (int i = 0; i < ALPHABET_SIZE; i++)
                children[i] = null;
  
            word = new ArrayList();
        }
    }
  
    static TrieNode root;
  
    // Function to insert word into the Trie
    static void insert(String word) {
        int index;
        TrieNode pCrawl = root;
  
        for (int level = 0; level < word.length(); level++) {
    
              // consider only uppercase characters
            if (Character.isLowerCase(word.charAt(level)))
                continue;
  
            // get current character position
            index = word.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;
  
        // push word into vector associated with leaf node
        (pCrawl.word).add(word);
    }
  
    // Function to print all children of Trie node root
    static void printAllWords(TrieNode root) {
  
        // if current node is leaf
        if (root.isLeaf) {
            for (String str : root.word)
                System.out.println(str);
        }
  
        // recurse for all children of root node
        for (int i = 0; i < ALPHABET_SIZE; i++) {
            TrieNode child = root.children[i];
            if (child != null)
                printAllWords(child);
        }
    }
  
    // search for pattern in Trie and print all words
    // matching that pattern
    static boolean search(String pattern) {
        int index;
        TrieNode pCrawl = root;
  
        for (int level = 0; level < pattern.length(); level++) {
            index = pattern.charAt(level) - 'A';
  
            // Invalid pattern
            if (pCrawl.children[index] == null)
                return false;
  
            pCrawl = pCrawl.children[index];
        }
  
        // print all words matching that pattern
        printAllWords(pCrawl);
  
        return true;
    }
  
    // Main function to print all words in the CamelCase
    // dictionary that matches with a given pattern
    static void findAllWords(List dict, String pattern)
     {
  
        // construct Trie root node
        root = new TrieNode();
  
        // Construct Trie from given dict
        for (String word : dict)
            insert(word);
  
        // search for pattern in Trie
        if (!search(pattern))
            System.out.println("No match found");
    }
  
    // Driver function
    public static void main(String args[]) {
  
        // dictionary of words where each word follows
        // CamelCase notation
        List dict = Arrays.asList("Hi", "Hello",
                           "HelloWorld", "HiTech", "HiGeek",
                          "HiTechWorld", "HiTechCity",
                            "HiTechLab");
  
        // pattern consisting of uppercase characters only
        String pattern = "HT";
  
        findAllWords(dict, pattern);
    }
}
// This code is contributed by Sumit Ghosh


C#
// C# program to print all words in 
// the CamelCase dictionary that
// matches with a given pattern
using System;
using System.Collections.Generic;
  
class GFG
{
  
    // Alphabet size (# of upper-Case characters)
    static int ALPHABET_SIZE = 26;
  
    // A 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;
  
        // vector to store list of complete words
        // in leaf node
        public List word;
  
        public TrieNode() 
        {
            isLeaf = false;
            for (int i = 0; i < ALPHABET_SIZE; i++)
                children[i] = null;
  
            word = new List();
        }
    }
  
    static TrieNode root;
  
    // Function to insert word into the Trie
    static void insert(String word)
    {
        int index;
        TrieNode pCrawl = root;
  
        for (int level = 0;
                 level < word.Length; level++) 
        {
      
            // consider only uppercase characters
            if (char.IsLower(word[level]))
                continue;
  
            // get current character position
            index = word[level] - 'A';
            if (pCrawl.children[index] == null)
                pCrawl.children[index] = new TrieNode();
  
            pCrawl = pCrawl.children[index];
        }
  
        // mark last node as leaf
        pCrawl.isLeaf = true;
  
        // push word into vector 
        // associated with leaf node
        (pCrawl.word).Add(word);
    }
  
    // Function to print all children 
    // of Trie node root
    static void printAllWords(TrieNode root) 
    {
  
        // if current node is leaf
        if (root.isLeaf) 
        {
            foreach (String str in root.word)
                Console.WriteLine(str);
        }
  
        // recurse for all children of root node
        for (int i = 0; i < ALPHABET_SIZE; i++) 
        {
            TrieNode child = root.children[i];
            if (child != null)
                printAllWords(child);
        }
    }
  
    // search for pattern in Trie and 
    // print all words matching that pattern
    static bool search(String pattern)
    {
        int index;
        TrieNode pCrawl = root;
  
        for (int level = 0;
                 level < pattern.Length; 
                 level++)
        {
            index = pattern[level] - 'A';
  
            // Invalid pattern
            if (pCrawl.children[index] == null)
                return false;
  
            pCrawl = pCrawl.children[index];
        }
  
        // print all words matching that pattern
        printAllWords(pCrawl);
  
        return true;
    }
  
    // Main function to print all words 
    // in the CamelCase dictionary that
    // matches with a given pattern
    static void findAllWords(List dict, 
                                  String pattern)
    {
  
        // construct Trie root node
        root = new TrieNode();
  
        // Construct Trie from given dict
        foreach (String word in dict)
            insert(word);
  
        // search for pattern in Trie
        if (!search(pattern))
            Console.WriteLine("No match found");
    }
  
    // Driver Code
    public static void Main(String []args)
    {
  
        // dictionary of words where each word follows
        // CamelCase notation
        List dict = new List{"Hi", "Hello",
                                             "HelloWorld", "HiTech", 
                                             "HiGeek", "HiTechWorld", 
                                             "HiTechCity", "HiTechLab"};
  
        // pattern consisting of 
        // uppercase characters only
        String pattern = "HT";
  
        findAllWords(dict, pattern);
    }
}
  
// This code is contributed by Princi Singh


输出:

HiTech
HiTechCity
HiTechLab
HiTechWorld