Open In App

Count occurrences of substring X before every occurrence of substring Y in a given string

Last Updated : 25 May, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

Given three strings S, X, and Y consisting of N, A, and B characters respectively, the task is to find the number of occurrences of the substring X before every occurrence of the substring Y in the given string S.

Examples:

Input S = ”abcdefdefabc”, X = ”def”, Y = ”abc”
Output: 0 2
Explanation:
First occurrence of Y(= “abc”): No of occurrences of X(= “def”) = 0.
Second occurrence of Y: No of occurrences of X = 0.

Input: S = ”accccbbbbbbaaa”, X = ”a”, Y = ”b”
Output: 0 6 6 6

Approach: Follow the steps below to solve the problem:

  • Initialize a variable, say count, that stores the total number occurrences of X.
  • Traverse the given string S and perform the following steps:
    • If the substring over the range [i, B] is equal to Y, then increment count by 1.
    • If the substring over the range [i, A] is equal to X, then print the value of count as the resultant count of the string Y before the current occurrence of the string X.

Below is the implementation of the above approach:

C++




// C++ program for the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to count occurrences of
// the string Y in the string S for
// every occurrence of X in S
void countOccurrences(string S,
                      string X,
                      string Y)
{
    // Stores the count of
    // occurrences of X
    int count = 0;
 
    // Stores the lengths of the
    // three strings
    int N = S.length(), A = X.length();
    int B = Y.length();
 
    // Traverse the string S
    for (int i = 0; i < N; i++) {
 
        // If the current substring
        // is Y, then increment the
        // value of count by 1
        if (S.substr(i, B) == Y)
            count++;
 
        // If the current substring
        // is X, then print the count
        if (S.substr(i, A) == X)
            cout << count << " ";
    }
}
 
// Driver Code
int main()
{
    string S = "abcdefdefabc";
    string X = "abc";
    string Y = "def";
    countOccurrences(S, X, Y);
 
    return 0;
}


Java




// Java program for the above approach
import java.io.*;
import java.lang.*;
import java.util.*;
 
public class GFG {
 
    // Function to count occurrences of
    // the string Y in the string S for
    // every occurrence of X in S
    static void countOccurrences(String S, String X,
                                 String Y)
    {
        // Stores the count of
        // occurrences of X
        int count = 0;
 
        // Stores the lengths of the
        // three strings
        int N = S.length(), A = X.length();
        int B = Y.length();
 
        // Traverse the string S
        for (int i = 0; i < N; i++) {
 
            // If the current substring
            // is Y, then increment the
            // value of count by 1
            if (S.substring(i, Math.min(N, i + B))
                    .equals(Y))
                count++;
 
            // If the current substring
            // is X, then print the count
            if (S.substring(i, Math.min(N, i + A))
                    .equals(X))
                System.out.print(count + " ");
        }
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        String S = "abcdefdefabc";
        String X = "abc";
        String Y = "def";
        countOccurrences(S, X, Y);
    }
}
 
// This code is contributed by Kingash.


Python3




# Python program for the above approach
 
# Function to count occurrences of
# the string Y in the string S for
# every occurrence of X in S
def countOccurrences(S, X, Y):
   
    # Stores the count of
    # occurrences of X
    count = 0
 
    # Stores the lengths of the
    # three strings
    N = len(S)
    A = len(X)
    B = len(Y)
 
    # Traverse the string S
    for  i in range( 0,  N):
       
        # If the current substring
        # is Y, then increment the
        # value of count by 1
        if (S[i: i+B] == Y):
            count+=1
 
        # If the current substring
        # is X, then print the count
        if (S[i:i+A] == X):
            print(count, end = " ")
             
# Driver Code
S = "abcdefdefabc"
X = "abc"
Y = "def"
countOccurrences(S, X, Y)
 
# This code is contributed by rohitsingh07052.


C#




// C# program for the above approach
using System;
public class GFG {
 
    // Function to count occurrences of
    // the string Y in the string S for
    // every occurrence of X in S
    static void countOccurrences(string S, string X,
                                 string Y)
    {
        // Stores the count of
        // occurrences of X
        int count = 0;
 
        // Stores the lengths of the
        // three strings
        int N = S.Length, A = X.Length;
        int B = Y.Length;
        int P = Math.Min(A, Math.Min(N, B));
 
        // Traverse the string S
        for (int i = 0; i < N - P + 1; i++) {
 
            // If the current substring
            // is Y, then increment the
            // value of count by 1
 
            if (S.Substring(i, Math.Min(N, B)).Equals(Y))
                count++;
 
            // If the current substring
            // is X, then print the count
            if (S.Substring(i, Math.Min(N, A)).Equals(X))
                Console.Write(count + " ");
        }
    }
 
    // Driver Code
    public static void Main(string[] args)
    {
        string S = "abcdefdefabc";
        string X = "abc";
        string Y = "def";
        countOccurrences(S, X, Y);
    }
}
 
// This code is contributed by ukasp.


Javascript




<script>
 
// Js program for the above approach
 
// Function to count occurrences of
// the string Y in the string S for
// every occurrence of X in S
function countOccurrences( S, X, Y){
    // Stores the count of
    // occurrences of X
    let count = 0;
    // Stores the lengths of the
    // three strings
    let N = S.length, A = X.length;
    let B = Y.length;
    // Traverse the string S
    for (let i = 0; i < N; i++) {
        // If the current substring
        // is Y, then increment the
        // value of count by 1
        if (S.substr(i, B) == Y)
            count++;
 
        // If the current substring
        // is X, then print the count
        if (S.substr(i, A) == X)
            document.write(count," ");
    }
}
 
// Driver Code
let S = "abcdefdefabc", X = "abc", Y = "def";
countOccurrences(S, X, Y);
 
</script>


Output: 

0 2

 

Time Complexity: O(N*(A + B)), as we are using a loop to traverse N times and we are using inbuilt substring function which will cost us the O(A+B) time.
Auxiliary Space: O(1), as we are not using any extra space.



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads