Spell Checker using Trie - GeeksforGeeks

31 Mar, 2021
Given an array of strings str[] and a string key, the task is to check if the spelling of the key is correct or not. If found to be true, then print “YES”. Otherwise, print the suggested correct spellings.
Examples:
Input:str[] = { “gee”, “geeks”, “ape”, “apple”, “geeksforgeeks” }, key = “geek” Output: geeks geeksforgeeks Explanation: The string “geek” not present in the array of strings. Therefore, the suggested words are { “geeks”, “geeksforgeeks” }.
Input: str[] = { “gee”, “geeks”, “ape”, “apple”, “arp” }, key = “geeks” Output: YES.
Approach:The problem can be solved using Trie. The idea is to traverse the array of string, str[] and insert the string into the Trie such that each node of the Trie contains the character of the string and a boolean value to check if the character is the last character of the string or not. Follow the steps below to solve the problem:
Initialize a Trie, say root, such that each node of the Trie consists of a character of a string and a boolean value to check if the character is the last character of the string or not.
Traverse the array of strings arr[], and insert all the strings into the Trie.
Finally, traverse the string key. For every ith character, check if the character is present in the Trie or not. If found to be true, then move to the next node of the Trie.
Otherwise, print all possible strings whose prefix is the string key.
Below is the implementation of the above approach:
C++
Java
// C++ program to implement// the above approach#include <bits/stdc++.h>using namespace std; // Structure of a Trie nodestruct TrieNode {     // Store address of a character    TrieNode* Trie[256];     // Check if the character is    // last character of a string or not    bool isEnd;     // Constructor function    TrieNode()    {         for (int i = 0; i < 256; i++) {             Trie[i] = NULL;        }        isEnd = false;    }}; // Function to insert a string into Trievoid InsertTrie(TrieNode* root, string s){     TrieNode* temp = root;     // Traverse the string, s    for (int i = 0; i < s.length(); i++) {         if (temp->Trie[s[i]] == NULL) {             // Initialize a node            temp->Trie[s[i]] = new TrieNode();        }         // Update temp        temp = temp->Trie[s[i]];    }     // Mark the last character of    // the string to true    temp->isEnd = true;} // Function to print suggestions of the stringvoid printSuggestions(TrieNode* root, string res){     // If current character is    // the last character of a string    if (root->isEnd == true) {         cout << res << " ";    }     // Iterate over all possible    // characters of the string    for (int i = 0; i < 256; i++) {         // If current character        // present in the Trie        if (root->Trie[i] != NULL) {             // Insert current character            // into Trie            res.push_back(i);            printSuggestions(root->Trie[i], res);            res.pop_back();        }    }} // Function to check if the string// is present in Trie or notbool checkPresent(TrieNode* root, string key){     // Traverse the string    for (int i = 0; i < key.length(); i++) {         // If current character not        // present in the Trie        if (root->Trie[key[i]] == NULL) {             printSuggestions(root, key.substr(0, i));             return false;        }         // Update root        root = root->Trie[key[i]];    }    if (root->isEnd == true) {         return true;    }    printSuggestions(root, key);     return false;} // Driver Codeint main(){     // Given array of strings    vector<string> str = { "gee", "geeks", "ape",                           "apple", "geeksforgeeks" };     string key = "geek";     // Initialize a Trie    TrieNode* root = new TrieNode();     // Insert strings to trie    for (int i = 0; i < str.size(); i++) {        InsertTrie(root, str[i]);    }     if (checkPresent(root, key)) {         cout << "YES";    }    return 0;}
// Java program to implement// the above approachimport java.io.*; // Structure of a Trie nodeclass TrieNode{         // Store address of a character    TrieNode Trie[];     // Check if the character is    // last character of a string or not    boolean isEnd;     // Constructor function    public TrieNode()    {        Trie = new TrieNode[256];        for(int i = 0; i < 256; i++)        {            Trie[i] = null;        }        isEnd = false;    }} class GFG{ // Function to insert a string into Triestatic void InsertTrie(TrieNode root, String s){    TrieNode temp = root;     // Traverse the string, s    for(int i = 0; i < s.length(); i++)    {        if (temp.Trie[s.charAt(i)] == null)        {                         // Initialize a node            temp.Trie[s.charAt(i)] = new TrieNode();        }         // Update temp        temp = temp.Trie[s.charAt(i)];    }     // Mark the last character of    // the string to true    temp.isEnd = true;} // Function to print suggestions of the stringstatic void printSuggestions(TrieNode root, String res){     // If current character is    // the last character of a string    if (root.isEnd == true)    {        System.out.print(res + " ");    }     // Iterate over all possible    // characters of the string    for(int i = 0; i < 256; i++)    {                 // If current character        // present in the Trie        if (root.Trie[i] != null)        {                         // Insert current character            // into Trie            res += (char)i;            printSuggestions(root.Trie[i], res);            res = res.substring(0, res.length() - 2);        }    }} // Function to check if the string// is present in Trie or notstatic boolean checkPresent(TrieNode root, String key){     // Traverse the string    for(int i = 0; i < key.length(); i++)    {                 // If current character not        // present in the Trie        if (root.Trie[key.charAt(i)] == null)        {            printSuggestions(root, key.substring(0, i));            return false;        }         // Update root        root = root.Trie[key.charAt(i)];    }    if (root.isEnd == true)    {        return true;    }    printSuggestions(root, key);     return false;} // Driver Codepublic static void main(String[] args){         // Given array of strings    String str[] = { "gee", "geeks", "ape", "apple",                     "geeksforgeeks" };     String key = "geek";     // Initialize a Trie    TrieNode root = new TrieNode();     // Insert strings to trie    for(int i = 0; i < str.length; i++)    {        InsertTrie(root, str[i]);    }     if (checkPresent(root, key))    {        System.out.println("YES");    }}} // This code is contributed by Dharanendra L V.
geeks geeksforgeeks
 
Time Complexity: O(N * M), where M is the maximum length of the string Auxiliary Space: O(N * 256)
dharanendralv23
Google
interview-preparation
Technical Scripter 2020
Trie
Advanced Data Structure
Hash
Strings
Technical Scripter
Google
Hash
Strings
Trie
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Extendible Hashing (Dynamic approach to DBMS)
Ternary Search Tree
Proof that Dominant Set of a Graph is NP-Complete
2-3 Trees | (Search, Insert and Deletion)
Quad Tree
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
Internal Working of HashMap in Java
Hashing | Set 1 (Introduction)
Count pairs with given sum
Hashing | Set 3 (Open Addressing)