Skip to content
Related Articles

Related Articles

Maximum consecutive occurrences of a string in another given string
  • Last Updated : 12 Jan, 2021

Given two strings str1 and str2, the task is to count the maximum consecutive occurrences of the string str2 in the string str1.

Examples:

Input: str1 = “abababcba”, str2 = “ba” 
Output: 2 
Explanation: String str2 occurs consecutively in the substring { str[1], …, str[4] }. Therefore, the maximum count obtained is 2

Input: str1 = “ababc”, str2 = “ac” 
Output:
Explanation: 
Since str2 is not present as a substring in str1, the required output is 0.

Approach: Follow the steps below to solve the problem:



  • Initialize a variable, say cntOcc, to store the count of occurrences of str2 in the string str1.
  • Iterate over the range [CntOcc, 1]. For every ith value in the iteration, concatenate the string str2 i times and check if the concatenated string is a substring of the string str1 or not. The first ith value for which it is found to be true, print it as the required answer.

Below is the implementation:

C++




// C++ program to implement
// the above approach
#include <bits/stdc++.h>
#include <string.h>
using namespace std;
 
int countFreq(string& pat, string& txt)
{
    int M = pat.length();
    int N = txt.length();
    int res = 0;
 
    // A loop to slide pat[] one by one
    for(int i = 0; i <= N - M; i++)
    {
         
        // For current index i, check
        // for pattern match
        int j;
        for(j = 0; j < M; j++)
            if (txt[i + j] != pat[j])
                break;
 
        // If pat[0...M-1] = txt[i, i+1, ...i+M-1]
        if (j == M)
        {
            res++;
            j = 0;
        }
    }
    return res;
}
 
// Function to count the maximum
// consecutive occurrence of the
// string str2 in in the string str1
int maxRepeating(string str1, string str2)
{
     
    // Stores the count of consecutive
    // occurrences of str2 in str1
    int cntOcc = countFreq(str2, str1);
     
    // Concatenate str2 cntOcc times
    string Contstr = "";
 
    for(int i = 0; i < cntOcc; i++)
        Contstr += str2;
 
    // Iterate over the string str1
    // while Contstr is not present in str1
    size_t found = str1.find(Contstr);
     
    while (found == string::npos)
    {
        found = str1.find(Contstr);
         
        // Update cntOcc
        cntOcc -= 1;
 
        // Update Contstr
        Contstr = "";
         
        for(int i = 0; i < cntOcc; i++)
            Contstr += str2;
    }
    return cntOcc;
}
 
// Driver Code
int main()
{
    string str1 = "abababc";
    string str2 = "ba";
     
    cout << maxRepeating(str1, str2);
 
    return 0;
}
 
// This code is contributed by grand_master

Java




// Java program to implement
// the above approach
 
import java.util.*;
class GFG
{
static int countFreq(String pat, String txt)
{
    int M = pat.length();
    int N = txt.length();
    int res = 0;
 
    // A loop to slide pat[] one by one
    for(int i = 0; i <= N - M; i++)
    {
         
        // For current index i, check
        // for pattern match
        int j;
        for(j = 0; j < M; j++)
            if (txt.charAt(i + j) != pat.charAt(j))
                break;
 
        // If pat[0...M-1] = txt[i, i+1, ...i+M-1]
        if (j == M)
        {
            res++;
            j = 0;
        }
    }
    return res;
}
 
// Function to count the maximum
// consecutive occurrence of the
// String str2 in in the String str1
static int maxRepeating(String str1, String str2)
{
     
    // Stores the count of consecutive
    // occurrences of str2 in str1
    int cntOcc = countFreq(str2, str1);
     
    // Concatenate str2 cntOcc times
    String Contstr = "";
 
    for(int i = 0; i < cntOcc; i++)
        Contstr += str2;
 
    // Iterate over the String str1
    // while Contstr is not present in str1
    boolean found = str1.contains(Contstr);
     
    while (!found)
    {
        found = str1.contains(Contstr);
         
        // Update cntOcc
        cntOcc -= 1;
 
        // Update Contstr
        Contstr = "";
         
        for(int i = 0; i < cntOcc; i++)
            Contstr += str2;
    }
    return cntOcc;
}
 
// Driver Code
public static void main(String[] args)
{
    String str1 = "abababc";
    String str2 = "ba"
    System.out.print(maxRepeating(str1, str2));
}
}
 
// This code is contributed by 29AjayKumar

Python3




# Python3 program to implement
# the above approach
 
# Function to count the maximum
# consecutive occurrence of the
# string str2 in in the string str1
def maxRepeating(str1, str2):
 
    # Stores the count of consecutive
    # occurrences of str2 in str1
    cntOcc = str1.count(str2)
 
    # Concatenate str2 cntOcc times
    Contstr = str2 * cntOcc
 
     
    # Iterate over the string str1
    # while Contstr is not present in str1
    while(Contstr not in str1):
 
        # Update cntOcc
        cntOcc -= 1
         
       # Update Contstr
        Contstr = str2 * cntOcc
         
    return cntOcc
 
# Driver Code
if __name__ =="__main__":
  str1 = "abababc"
  str2 = "ba"
  print(maxRepeating(str1, str2))
  

C#




// C# program to implement
// the above approach
using System;
 
class GFG
{
static int countFreq(String pat, String txt)
{
    int M = pat.Length;
    int N = txt.Length;
    int res = 0;
 
    // A loop to slide pat[] one by one
    for(int i = 0; i <= N - M; i++)
    {
         
        // For current index i, check
        // for pattern match
        int j;
        for(j = 0; j < M; j++)
            if (txt[i + j] != pat[j])
                break;
 
        // If pat[0...M-1] = txt[i, i+1, ...i+M-1]
        if (j == M)
        {
            res++;
            j = 0;
        }
    }
    return res;
}
 
// Function to count the maximum
// consecutive occurrence of the
// String str2 in in the String str1
static int maxRepeating(String str1, String str2)
{
     
    // Stores the count of consecutive
    // occurrences of str2 in str1
    int cntOcc = countFreq(str2, str1);
     
    // Concatenate str2 cntOcc times
    String Contstr = "";
 
    for(int i = 0; i < cntOcc; i++)
        Contstr += str2;
 
    // Iterate over the String str1
    // while Contstr is not present in str1
    bool found = str1.Contains(Contstr);   
    while (!found)
    {
        found = str1.Contains(Contstr);
         
        // Update cntOcc
        cntOcc -= 1;
 
        // Update Contstr
        Contstr = "";
         
        for(int i = 0; i < cntOcc; i++)
            Contstr += str2;
    }
    return cntOcc;
}
 
// Driver Code
public static void Main(String[] args)
{
    String str1 = "abababc";
    String str2 = "ba"
    Console.Write(maxRepeating(str1, str2));
}
}
 
// This code is contributed by 29AjayKumar
Output: 
2

 

Time Complexity: O(N2) 
Auxiliary Space: O(N)

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

My Personal Notes arrow_drop_up
Recommended Articles
Page :