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++
// 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 str2 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. 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 function int main() { vector <string > dict = {"ale", "apple", "monkey", "plea"}; string str = "abpcplea" ; cout << findLongestString(dict, str) << endl; return 0; } |
Java
// 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
# 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 str2 def 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#
// C# program to find largest // word in Dictionary by deleting // some characters of given String using 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 // 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 str2 function 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 ?> |
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)
This article is contributed by Nishant Singh. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@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.
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
Recommended Posts:
- Largest string obtained in Dictionary order after deleting K characters
- Wrap every continuous instance of given word with some given string
- Find the word from a given sentence having given word as prefix
- C program to find and replace a word in a File by another given word
- Minimum steps to delete a string by deleting substring comprising of same characters
- Determine the winner of a game of deleting Characters from a String
- Check if a string can become empty by recursively deleting a given sub-string
- C program to Replace a word in a text by another given word
- Program to find Smallest and Largest Word in a String
- Count of characters in str1 such that after deleting anyone of them str1 becomes str2
- Longest suffix such that occurrence of each character is less than N after deleting atmost K characters
- Longest Common Prefix using Word by Word Matching
- Find the count of sub-strings whose characters can be rearranged to form the given word
- Count distinct substrings that contain some characters at most k times
- Find Kth largest string from the permutations of the string with two characters
- Lexicographically largest string for given dictionary order
- Python Dictionary to find mirror characters in a string
- Given a sorted dictionary of an alien language, find order of characters
- Print list items containing all characters of a given word
- Possibility of a word from a given set of characters

