Count occurrences of a substring recursively
Given two strings str1 and str2, the task is to count the number of times str2 occurs in str1 using recursion.
Examples:
Input: str1 = “w3wiki”, str2 = “geek”
Output: 2
Explanation: The occurrences of str2 in str1 are starting at index {0, 8}Input: str1 = “aaaaa”, str2 = “aaa”
Output: 3
Explanation: The occurrences of str2 in str1 are starting at index {0,1,2
Approach: We have already discussed other approaches in our previous article but here we are going to solve this problem using recursion.
Algorithm:
- If size of string str2 is greater then string str1 or size of string str1 is 0 then, return 0.
- Otherwise, Check if string str2 is present in str1 as substring or not.
- if present then, increment the count of occurrence and recursively call for other substring.
- else, recursively call for other substring.
- return count from every recursively call as answer.
Below is the implementation of the above approach:
C++
// Recursive C++ program to count the number of // times string str2 occurs in string str1 #include <iostream> #include <string> using namespace std; // Function to count the number of // times string str2 occurs in string str1 int countSubstring(string str1, string str2) { int n1 = str1.length(); int n2 = str2.length(); // Base Case if (n1 == 0 || n1 < n2) return 0; // Recursive Case // Checking if the first substring matches if (str1.substr(0, n2).compare(str2) == 0) return countSubstring(str1.substr(1), str2) + 1; // Otherwise, return the count from // the remaining index return countSubstring(str1.substr(1), str2); } // Driver function int main() { string str1 = "w3wiki" , str2 = "Beginner" ; cout << countSubstring(str1, str2) << endl; str1 = "aaaaa" , str2 = "aaa" ; cout << countSubstring(str1, str2) << endl; return 0; } |
Java
// Recursive Java program for // counting number of substrings class GFG { // Recursive function to // count the number of // occurrences of "hi" in str. static int countSubstring(String str1, String str2) { int n1 = str1.length(); int n2 = str2.length(); // Base Case if (n1 == 0 || n1 < n2) return 0 ; // Recursive Case // Checking if the first // substring matches if (str1.substring( 0 , n2).equals(str2)) return countSubstring(str1.substring( 1 ), str2) + 1 ; // Otherwise, return the count // from the remaining index return countSubstring(str1.substring( 1 ), str2); } // Driver Code public static void main(String args[]) { String str1 = "w3wiki" , str2 = "Beginner" ; System.out.println(countSubstring(str1, str2)); str1 = "aaaaa" ; str2 = "aaa" ; System.out.println(countSubstring(str1, str2)); } } // This code is contributed // by Arnab Kundu |
Python3
# Recursive Python3 program for # counting number of substrings # Recursive function to # count the number of # occurrences of "hi" in str. def countSubstring(str1, str2): n1 = len (str1); n2 = len (str2); # Base Case if (n1 = = 0 or n1 < n2): return 0 ; # Recursive Case # Checking if the first # substring matches if (str1[ 0 : n2] = = str2): return countSubstring(str1[ 1 :], str2) + 1 ; # Otherwise, return the count # from the remaining index return countSubstring(str1[ 1 :], str2); # Driver Code if __name__ = = '__main__' : str1 = "w3wiki" ; str2 = "Beginner" ; print (countSubstring(str1, str2)); str1 = "aaaaa" ; str2 = "aaa" ; print (countSubstring(str1, str2)); # This code is contributed by Princi Singh |
C#
// Recursive C# program for // counting number of substrings using System; class GFG { // Recursive function to // count the number of // occurrences of "hi" in str. static int countSubstring(String str1, String str2) { int n1 = str1.Length; int n2 = str2.Length; // Base Case if (n1 == 0 || n1 < n2) return 0; // Recursive Case // Checking if the first // substring matches if (str1.Substring(0, n2).Equals(str2)) return countSubstring(str1.Substring(1), str2) + 1; // Otherwise, return the // count from the remaining // index return countSubstring(str1.Substring(1), str2); } // Driver Code public static void Main() { string str1 = "w3wiki" , str2 = "Beginner" ; Console.Write(countSubstring(str1, str2)); Console.Write( "\n" ); str1 = "aaaaa" ; str2 = "aaa" ; Console.Write(countSubstring(str1, str2)); } } // This code is contributed // by Smita |
Javascript
<script> // Recursive js program for counting number of substrings // Recursive function to count // the number of occurrences of "hi" in str. function countSubstring( str1, str2){ let n1 = str1.length; let n2 = str2.length; // Base Case if (n1 == 0 || n1 < n2) return 0; // Recursive Case // Checking if the first substring matches if (str1.substr(0, n2) == (str2)) return countSubstring(str1.substr(1), str2) + 1; // Otherwise, return the count from // the remaining index return countSubstring(str1.substr(1), str2); } // Driver function let str1 = "w3wiki" , str2 = "Beginner" ; document.write( countSubstring(str1, str2), '<br>' ); str1 = "aaaaa" , str2 = "aaa" ; document.write( countSubstring(str1, str2), '<br>' ); </script> |
Output
2 3
Complexity Analysis:
- Time Complexity: O(N2) , (i.e. N is maximum length between str1 and str2)
- Auxiliary Space: O(1)