Related Articles

# Recursive function to do substring search

• Difficulty Level : Easy
• Last Updated : 23 May, 2019

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:

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.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

```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``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;``}`

## 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.`

Output:
```1
0
1```