Recursive function to do substring search
Given a text txt[] and a pattern pat[], write a recursive function “contains(char pat[], char txt[])” that returns true if pat[] is present in txt[], otherwise false. Examples:
1) Input: txt[] = "THIS IS A TEST TEXT" pat[] = "TEST" Output: true 2) Input: txt[] = "geeksforgeeks" pat[] = "quiz" Output: false;
We strongly recommend to minimize the browser and try this yourself first. Below is recursive algorithm.
contains(tex[], pat[]) 1) If the current character is the last character of the text, but pat has more characters, return false. 2) Else If the current character is the last character of the pattern, then return true 3) Else If current characters of pat and text match, then return contains(text + 1, pat + 1); 4) Else If current characters of pat and text don't match return contains(text + 1, pat);
Below is the implementation of the above algorithm.
C++
// Recursive C++ program to find if a given pattern is // present in a text #include<iostream> using namespace std; bool exactMatch( char *text, char *pat) { if (*text == '\0' && *pat != '\0' ) return false ; // Else If last character of pattern reaches if (*pat == '\0' ) return true ; if (*text == *pat) return exactMatch(text + 1, pat + 1); return false ; } // This function returns true if 'text' contain 'pat' bool contains( char *text, char *pat) { // If last character of text reaches if (*text == '\0' ) return false ; // If current characters of pat and text match if (*text == *pat) if (exactMatch(text, pat)) return 1; else return contains(text + 1, pat); // If current characters of pat and tex don't match return contains(text + 1, pat); } // Driver program to test above function int main() { cout << contains( "geeksforgeeks" , "geeks" ) << endl; cout << contains( "geeksforgeeks" , "geeksquiz" ) << endl; cout << contains( "geeksquizgeeks" , "quiz" ) << endl; return 0; } |
Java
// Recursive Java program to find if a given pattern is // present in a text class GFG { static int exactMatch(String text, String pat, int text_index, int pat_index) { if (text_index == text.length() && pat_index != pat.length()) return 0 ; // Else If last character of pattern reaches if (pat_index == pat.length()) return 1 ; if (text.charAt(text_index) == pat.charAt(pat_index)) return exactMatch(text, pat, text_index + 1 , pat_index + 1 ); return 0 ; } // This function returns true if 'text' contain 'pat' static int contains(String text, String pat, int text_index, int pat_index) { // If last character of text reaches if (text_index == text.length()) return 0 ; // If current characters of pat and text match if (text.charAt(text_index) == pat.charAt(pat_index)) { if (exactMatch(text, pat, text_index, pat_index) == 1 ) return 1 ; else return contains(text, pat, text_index + 1 , pat_index); } // If current characters of pat and tex don't match return contains(text, pat, text_index + 1 , pat_index); } // Driver program to test the above function public static void main(String args[]) { System.out.println(contains( "geeksforgeeks" , "geeks" , 0 , 0 )); System.out.println(contains( "geeksforgeeks" , "geeksquiz" , 0 , 0 )); System.out.println(contains( "geeksquizgeeks" , "quiz" , 0 , 0 )); } } // This code is contributed by Saurabh Jaiswal |
Python3
# Recursive Python3 program to find if a given pattern is # present in a text def exactMatch(text, pat, text_index, pat_index): if text_index = = len (text) and pat_index ! = len (pat): return 0 # Else If last character of pattern reaches if pat_index = = len (pat): return 1 if text[text_index] = = pat[pat_index]: return exactMatch(text, pat, text_index + 1 , pat_index + 1 ) return 0 # This function returns true if 'text' contain 'pat' def contains(text, pat, text_index, pat_index): # If last character of text reaches if text_index = = len (text): return 0 # If current characters of pat and text match if text[text_index] = = pat[pat_index]: if exactMatch(text, pat, text_index, pat_index): return 1 else : return contains(text, pat, text_index + 1 , pat_index) # If current characters of pat and tex don't match return contains(text , pat, text_index + 1 , pat_index) # Driver program to test the above function print (contains( "geeksforgeeks" , "geeks" , 0 , 0 )) print (contains( "geeksforgeeks" , "geeksquiz" , 0 , 0 )) print (contains( "geeksquizgeeks" , "quiz" , 0 , 0 )) # This code is contributed by ankush_953. |
Javascript
<script> // Recursive JavaScript program to find if a given pattern is // present in a text function exactMatch(text, pat, text_index, pat_index){ if (text_index == text.length && pat_index != pat.length) return 0 // Else If last character of pattern reaches if (pat_index == pat.length) return 1 if (text[text_index] == pat[pat_index]) return exactMatch(text, pat, text_index+1, pat_index+1) return 0 } // This function returns true if 'text' contain 'pat' function contains(text, pat, text_index, pat_index){ // If last character of text reaches if (text_index == text.length) return 0 // If current characters of pat and text match if (text[text_index] == pat[pat_index]){ if (exactMatch(text, pat, text_index, pat_index)) return 1 else return contains(text, pat, text_index+1, pat_index) } // If current characters of pat and tex don't match return contains(text , pat, text_index+1, pat_index) } // Driver program to test the above function document.write(contains( "geeksforgeeks" , "geeks" , 0, 0), "</br>" ) document.write(contains( "geeksforgeeks" , "geeksquiz" , 0, 0), "</br>" ) document.write(contains( "geeksquizgeeks" , "quiz" , 0, 0), "</br>" ) // This code is contributed by shinjanpatra. </script> |
Output:
1 0 1
Time Complexity : O(n*m)
Auxiliary Space : O(n+m)
This article is contributed by Bhupinder. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Python3
def str_search(st, text, k): n = len (st) m = len (text) if k < n - m + 1 : if st[k:k + m] = = text: return True else : return str_search(st, text, k + 1 ) else : return False t = 'this is a test text' print (str_search(t, 'test' , 0 )) |
Output
True
Please Login to comment...