Find largest word in dictionary by deleting some characters of given string - GeeksforGeeks

14 Mar, 2022
Giving a dictionary and a string ‘str’, find the longest string in dictionary which can be formed by deleting some characters of the given ‘str’. Examples: 
Input : dict = {"ale", "apple", "monkey", "plea"}   
        str = "abpcplea"  
Output : apple 

Input  : dict = {"pintu", "geeksfor", "geeksgeeks", 
                                        " forgeek"} 
         str = "geeksforgeeks"
Output : geeksgeeks
Asked In: Google Interview  
This problem reduces to finding if a string is subsequence of another string or not. We traverse all dictionary words and for every word, we check if it is subsequence of given string and is largest of all such words. We finally return the longest word with given string as subsequence.Below is the implementation of above idea  
C++
Java
Python3
C#
PHP
Javascript
// C++ program to find largest word in Dictionary// by deleting some characters of given string#include <bits/stdc++.h>using namespace std; // Returns true if str1[] is a subsequence of str2[].// m is length of str1 and n is length of str2bool isSubSequence(string str1, string str2){    int m = str1.length(), n = str2.length();     int j = 0; // For index of str1 (or subsequence     // Traverse str2 and str1, and compare current    // character of str2 with first unmatched char    // of str1, if matched then move ahead in str1    for (int i = 0; i < n && j < m; i++)        if (str1[j] == str2[i])            j++;     // If all characters of str1 were found in str2    return (j == m);} // Returns the longest string in dictionary which is a// subsequence of str.string findLongestString(vector<string> dict, string str){    string result = "";    int length = 0;     // Traverse through all words of dictionary    for (string word : dict) {        // If current word is subsequence of str and is        // largest such word so far.        if (length < word.length()            && isSubSequence(word, str)) {            result = word;            length = word.length();        }    }     // Return longest string    return result;} // Driver program to test above functionint main(){    vector<string> dict        = { "ale", "apple", "monkey", "plea" };    string str = "abpcplea";    cout << findLongestString(dict, str) << endl;    return 0;}
// Java program to find largest// word in Dictionary by deleting// some characters of given String import java.util.*; class GFG{     // Returns true if str1[] is a    // subsequence of str2[]. m is    // length of str1 and n is length of str2    static boolean isSubSequence(String str1,                                String str2)    {        int m = str1.length(), n = str2.length();         int j = 0; // For index of str1 (or subsequence)         // Traverse str2 and str1, and compare current        // character of str2 with first unmatched char        // of str1, if matched then move ahead in str1        for (int i = 0; i < n && j < m; i++)        {            if (str1.charAt(j) == str2.charAt(i))            {                j++;            }        }         // If all characters of str1        // were found in str2        return (j == m);    } // Returns the longest String// in dictionary which is a// subsequence of str.    static String findLongestString(Vector<String> dict,                                            String str)    {        String result = "";        int length = 0;         // Traverse through all words of dictionary        for (String word : dict)        {                         // If current word is subsequence of str            // and is largest such word so far.            if (length < word.length() &&                isSubSequence(word, str))            {                result = word;                length = word.length();            }        }         // Return longest String        return result;    }     // Driver code    public static void main(String[] args)    {        String[] arr = {"ale", "apple", "monkey", "plea"};        Vector dict = new Vector(Arrays.asList(arr));        String str = "abpcplea";        System.out.println(findLongestString(dict, str));    }} // This code is contributed by 29AjayKumar
# Python3 program to find largest word in Dictionary# by deleting some characters of given string # Returns true if str1[] is a subsequence of str2[].# m is length of str1 and n is length of str2def isSubSequence(str1, str2):     m = len(str1);    n = len(str2);     j = 0; # For index of str1 (or subsequence     # Traverse str2 and str1, and compare current    # character of str2 with first unmatched char    # of str1, if matched then move ahead in str1    i = 0;    while (i < n and j < m):        if (str1[j] == str2[i]):            j += 1;        i += 1;     # If all characters of str1 were found in str2    return (j == m); # Returns the longest string in dictionary which is a# subsequence of str.def findLongestString(dict1, str1):    result = "";    length = 0;     # Traverse through all words of dictionary    for word in dict1:                 # If current word is subsequence of str and is largest        # such word so far.        if (length < len(word) and isSubSequence(word, str1)):            result = word;            length = len(word);     # Return longest string    return result; # Driver program to test above function dict1 = ["ale", "apple", "monkey", "plea"];str1 = "abpcplea" ;print(findLongestString(dict1, str1));     # This code is conribued by mits
// C# program to find largest// word in Dictionary by deleting// some characters of given Stringusing System;using System.Collections.Generic; class GFG{     // Returns true if str1[] is a    // subsequence of str2[]. m is    // length of str1 and n is length of str2    static bool isSubSequence(String str1,                                String str2)    {        int m = str1.Length, n = str2.Length;         int j = 0; // For index of str1 (or subsequence)         // Traverse str2 and str1, and compare current        // character of str2 with first unmatched char        // of str1, if matched then move ahead in str1        for (int i = 0; i < n && j < m; i++)        {            if (str1[j] == str2[i])            {                j++;            }        }         // If all characters of str1        // were found in str2        return (j == m);    }     // Returns the longest String    // in dictionary which is a    // subsequence of str.    static String findLongestString(List<String> dict,                                            String str)    {        String result = "";        int length = 0;         // Traverse through all words of dictionary        foreach (String word in dict)        {                         // If current word is subsequence of str            // and is largest such word so far.            if (length < word.Length &&                isSubSequence(word, str))            {                result = word;                length = word.Length;            }        }         // Return longest String        return result;    }     // Driver code    public static void Main(String[] args)    {        String[] arr = {"ale", "apple", "monkey", "plea"};        List<String> dict = new List<String>(arr);        String str = "abpcplea";        Console.WriteLine(findLongestString(dict, str));    }} // This code contributed by Rajput-Ji
<?php// PHP program to find largest word in Dictionary// by deleting some characters of given string // Returns true if str1[] is a subsequence of str2[].// m is length of str1 and n is length of str2function isSubSequence($str1, $str2){    $m = strlen($str1);    $n = strlen($str2);     $j = 0; // For index of str1 (or subsequence     // Traverse str2 and str1, and compare current    // character of str2 with first unmatched char    // of str1, if matched then move ahead in str1    for ($i = 0; $i < $n && $j < $m; $i++)        if ($str1[$j] == $str2[$i])            $j++;     // If all characters of str1 were found in str2    return ($j == $m);} // Returns the longest string in dictionary which is a// subsequence of str.function findLongestString($dict, $str){    $result = "";    $length = 0;     // Traverse through all words of dictionary    foreach ($dict as $word)    {                 // If current word is subsequence        // of str and is largest        // such word so far.        if ($length < strlen($word) &&             isSubSequence($word, $str))        {            $result = $word;            $length = strlen($word);        }    }     // Return longest string    return $result;} // Driver code$dict = array("ale", "apple", "monkey", "plea");$str = "abpcplea" ;echo findLongestString($dict, $str);     // This code is conribued by mits?>
<script> // JavaScript program to find largest word in Dictionary// by deleting some characters of given string // Returns true if str1[] is a subsequence of str2[].// m is length of str1 and n is length of str2function isSubSequence(str1, str2){    var m = str1.length, n = str2.length;     var j = 0; // For index of str1 (or subsequence     // Traverse str2 and str1, and compare current    // character of str2 with first unmatched char    // of str1, if matched then move ahead in str1    for (var i = 0; i < n && j < m; i++)        if (str1[j] == str2[i])            j++;     // If all characters of str1 were found in str2    return (j == m);} // Returns the longest string in dictionary which is a// subsequence of str.function findLongestString(dict, str){    var result = "";    var length = 0;     // Traverse through all words of dictionary     dict.forEach(word => {                // If current word is subsequence of str and is        // largest such word so far.        if (length < word.length            && isSubSequence(word, str)) {            result = word;            length = word.length;        }    });     // Return longest string    return result;} // Driver program to test above functionvar dict    = ["ale", "apple", "monkey", "plea"];var str = "abpcplea";document.write( findLongestString(dict, str));  </script>
Output: 
apple
Time Complexity: O(N*(K+n)) Here N is the length of dictionary and n is the length of given string ‘str’ and K – maximum length of words in the dictionary.Auxiliary Space: O(1)  
An efficient solution is we Sort the dictionary word. We traverse all dictionary words and for every word, we check if it is subsequence of given string and at last we check this subsequence  is largest of all such subsequence.. We finally return the longest word with given string as subsequence.
C++
Python3
Javascript
// C++ program to find largest word in Dictionary// by deleting some characters of given string#include <bits/stdc++.h>using namespace std;    string res="";    void check(string d,string s)    {        int i=0;        int j=0;        while(i<d.size() && j<s.size())        {            if(d[i]==s[j])            {                i++;                j++;            }            else             j++;        }        if(i==d.size() && res.size()<d.size())        {            res=d;        }    }   string LongestWord(vector<string> d,string S) {     //sort the dictionary word     // for smallest lexicographical order           sort(d.begin(),d.end());     for(string c:d)     {         check(c,S);     }     return res;    }// Driver programint main(){    vector<string> dict        = { "ale", "apple", "monkey", "plea" };    string str = "abpcplea";    cout << LongestWord(dict, str) << endl;    return 0;}
# Python3 program to find largest word in Dictionary# by deleting some characters of given string res="" def check(d,s):    global res    i = 0    j = 0    while(i < len(d) and j < len(s)):         if(d[i] == s[j]):            i += 1            j += 1        else:            j += 1         if(i == len(d) and len(res) < len(d)):            res = d def LongestWord(d, S):       # sort the dictionary word    # for smallest lexicographical order      d.sort()     for c in d :        check(c,S)         return res # Driver programdict = [ "ale", "apple", "monkey", "plea" ]str = "abpcplea"print(LongestWord(dict, str)) # This code is contributed by shinjanpatra
<script> // JavaScript program to find largest word in Dictionary// by deleting some characters of given stringlet res="";function check(d, s){    let i = 0;    let j = 0;    while(i < d.length && j < s.length)    {        if(d[i] == s[j])        {            i++;            j++;        }        else            j++;        }        if(i == d.length && res.length < d.length)        {            res = d;        }    }function LongestWord(d,S){     // sort the dictionary word    // for smallest lexicographical order    d.sort();    for(let c of d)    {        check(c, S);    }    return res;} // Driver programlet dict = [ "ale", "apple", "monkey", "plea" ];let str = "abpcplea";document.write(LongestWord(dict, str),"</br>"); // This code is contributed by shinjanpatra </script>
YouTubeGeeksforGeeks500K subscribersFind largest word in dictionary by deleting some characters of given string | GeeksforGeeksWatch laterShareCopy linkInfoShoppingTap to unmuteIf playback doesn't begin shortly, try restarting your device.You're signed outVideos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer.CancelConfirmMore videosMore videosSwitch cameraShareInclude playlistAn error occurred while retrieving sharing information. Please try again later.Watch on0:000:000:00 / 2:38•Live•<div class="player-unavailable"><h1 class="message">An error occurred.</h1><div class="submessage"><a href="https://www.youtube.com/watch?v=31iAzVf8UxU" target="_blank">Try watching this video on www.youtube.com</a>, or enable JavaScript if it is disabled in your browser.</div></div>
This article is contributed by Nishant Singh. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
29AjayKumar
Rajput-Ji
Mithun Kumar
NikitaRana07
noob2000
pushkar_s
shinjanpatra
subsequence
Strings
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Python program to check if a string is palindrome or not
KMP Algorithm for Pattern Searching
Different methods to reverse a string in C/C++
Convert string to char array in C++
Caesar Cipher in Cryptography
Check for Balanced Brackets in an expression (well-formedness) using Stack
Array of Strings in C++ (5 Different Ways to Create)
Longest Palindromic Substring | Set 1
Hill Cipher
Length of the longest substring without repeating characters