Count occurrences of substring X before every occurrence of substring Y in a given string
Last Updated :
25 May, 2022
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++
#include <bits/stdc++.h>
using namespace std;
void countOccurrences(string S,
string X,
string Y)
{
int count = 0;
int N = S.length(), A = X.length();
int B = Y.length();
for ( int i = 0; i < N; i++) {
if (S.substr(i, B) == Y)
count++;
if (S.substr(i, A) == X)
cout << count << " " ;
}
}
int main()
{
string S = "abcdefdefabc" ;
string X = "abc" ;
string Y = "def" ;
countOccurrences(S, X, Y);
return 0;
}
|
Java
import java.io.*;
import java.lang.*;
import java.util.*;
public class GFG {
static void countOccurrences(String S, String X,
String Y)
{
int count = 0 ;
int N = S.length(), A = X.length();
int B = Y.length();
for ( int i = 0 ; i < N; i++) {
if (S.substring(i, Math.min(N, i + B))
.equals(Y))
count++;
if (S.substring(i, Math.min(N, i + A))
.equals(X))
System.out.print(count + " " );
}
}
public static void main(String[] args)
{
String S = "abcdefdefabc" ;
String X = "abc" ;
String Y = "def" ;
countOccurrences(S, X, Y);
}
}
|
Python3
def countOccurrences(S, X, Y):
count = 0
N = len (S)
A = len (X)
B = len (Y)
for i in range ( 0 , N):
if (S[i: i + B] = = Y):
count + = 1
if (S[i:i + A] = = X):
print (count, end = " " )
S = "abcdefdefabc"
X = "abc"
Y = "def"
countOccurrences(S, X, Y)
|
C#
using System;
public class GFG {
static void countOccurrences( string S, string X,
string Y)
{
int count = 0;
int N = S.Length, A = X.Length;
int B = Y.Length;
int P = Math.Min(A, Math.Min(N, B));
for ( int i = 0; i < N - P + 1; i++) {
if (S.Substring(i, Math.Min(N, B)).Equals(Y))
count++;
if (S.Substring(i, Math.Min(N, A)).Equals(X))
Console.Write(count + " " );
}
}
public static void Main( string [] args)
{
string S = "abcdefdefabc" ;
string X = "abc" ;
string Y = "def" ;
countOccurrences(S, X, Y);
}
}
|
Javascript
<script>
function countOccurrences( S, X, Y){
let count = 0;
let N = S.length, A = X.length;
let B = Y.length;
for (let i = 0; i < N; i++) {
if (S.substr(i, B) == Y)
count++;
if (S.substr(i, A) == X)
document.write(count, " " );
}
}
let S = "abcdefdefabc" , X = "abc" , Y = "def" ;
countOccurrences(S, X, Y);
</script>
|
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
Please Login to comment...