Given an array arr[] consisting of N integers and two positive integers M and K, the task is to check if there exists any subarray of length M that repeats consecutively at least K times. If found to be true, then print “Yes”. Otherwise, print “No”.
Examples:
Input: arr[] = {2, 1, 2, 1, 1, 1, 3}, M = 2, K = 2
Output: Yes
Explanation: The subarray {2, 1} of length 2 repeats at least K(= 2) times consecutively.Input: arr[] = {7, 1, 3, 1, 1, 1, 1, 3}, M = 1, K = 3
Output: Yes
Naive Approach: The simplest approach is to generate all possible subarrays of length M and check for each subarray, whether on concatenating it exactly K times is present as a subarray in the given array or not. If found to be true, then print “Yes”. Otherwise, print “No”.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> #include <iostream> using namespace std;
// Function to check if there exists // any subarray of length M repeating // at least K times consecutively bool check( int arr[], int M, int K,
int ind)
{ // Iterate from i equal 0 to M
for ( int i = 0; i < M; i++) {
// Iterate from j equals 1 to K
for ( int j = 1; j < K; j++) {
// If elements at pos + i and
// pos + i + j * M are not equal
if (arr[ind + i]
!= arr[ind + i + j * M]) {
return false ;
}
}
}
return true ;
} // Function to check if a subarray repeats // at least K times consecutively or not bool SubarrayRepeatsKorMore(
int arr[], int N, int M, int K)
{ // Iterate from ind equal 0 to M
for ( int ind = 0;
ind <= N - M * K; ind++) {
// Check if subarray arr[i, i + M]
// repeats atleast K times or not
if (check(arr, M, K, ind)) {
return true ;
}
}
// Otherwise, return false
return false ;
} // Driver Code int main()
{ int arr[] = { 2, 1, 2, 1, 1, 1, 3 };
int M = 2, K = 2;
int N = sizeof (arr) / sizeof (arr[0]);
if (SubarrayRepeatsKorMore(
arr, N, M, K)) {
cout << "Yes" ;
}
else {
cout << "No" ;
}
return 0;
} |
// Java program for the above approach import java.io.*;
import java.lang.*;
import java.util.*;
class GFG{
// Function to check if there exists // any subarray of length M repeating // at least K times consecutively static boolean check( int arr[], int M,
int K, int ind)
{ // Iterate from i equal 0 to M
for ( int i = 0 ; i < M; i++)
{
// Iterate from j equals 1 to K
for ( int j = 1 ; j < K; j++)
{
// If elements at pos + i and
// pos + i + j * M are not equal
if (arr[ind + i] != arr[ind + i + j * M])
{
return false ;
}
}
}
return true ;
} // Function to check if a subarray repeats // at least K times consecutively or not static boolean SubarrayRepeatsKorMore( int arr[], int N,
int M, int K)
{ // Iterate from ind equal 0 to M
for ( int ind = 0 ; ind <= N - M * K; ind++)
{
// Check if subarray arr[i, i + M]
// repeats atleast K times or not
if (check(arr, M, K, ind))
{
return true ;
}
}
// Otherwise, return false
return false ;
} // Driver Code public static void main(String[] args)
{ int arr[] = { 2 , 1 , 2 , 1 , 1 , 1 , 3 };
int M = 2 , K = 2 ;
int N = arr.length;
if (SubarrayRepeatsKorMore(arr, N, M, K))
{
System.out.println( "Yes" );
}
else {
System.out.println( "No" );
}
} } // This code is contributed by Kingash |
# Python3 program for the above approach # Function to check if there exists # any subarray of length M repeating # at least K times consecutively def check(arr, M, K, ind):
# Iterate from i equal 0 to M
for i in range (M):
# Iterate from j equals 1 to K
for j in range ( 1 , K, 1 ):
# If elements at pos + i and
# pos + i + j * M are not equal
if (arr[ind + i] ! = arr[ind + i + j * M]):
return False
return True
# Function to check if a subarray repeats # at least K times consecutively or not def SubarrayRepeatsKorMore(arr, N, M, K):
# Iterate from ind equal 0 to M
for ind in range (N - M * K + 1 ):
# Check if subarray arr[i, i + M]
# repeats atleast K times or not
if (check(arr, M, K, ind)):
return True
# Otherwise, return false
return False
# Driver Code if __name__ = = '__main__' :
arr = [ 2 , 1 , 2 , 1 , 1 , 1 , 3 ]
M = 2 K = 2
N = len (arr)
if (SubarrayRepeatsKorMore(arr, N, M, K)):
print ( "Yes" )
else :
print ( "No" )
# This code is contributed by bgangwar59 |
// C# program for the above approach using System;
class GFG{
// Function to check if there exists // any subarray of length M repeating // at least K times consecutively static bool check( int [] arr, int M, int K,
int ind)
{ // Iterate from i equal 0 to M
for ( int i = 0; i < M; i++)
{
// Iterate from j equals 1 to K
for ( int j = 1; j < K; j++)
{
// If elements at pos + i and
// pos + i + j * M are not equal
if (arr[ind + i] != arr[ind + i + j * M])
{
return false ;
}
}
}
return true ;
} // Function to check if a subarray repeats // at least K times consecutively or not static bool SubarrayRepeatsKorMore( int [] arr, int N,
int M, int K)
{ // Iterate from ind equal 0 to M
for ( int ind = 0; ind <= N - M * K; ind++)
{
// Check if subarray arr[i, i + M]
// repeats atleast K times or not
if (check(arr, M, K, ind))
{
return true ;
}
}
// Otherwise, return false
return false ;
} // Driver code static void Main()
{ int [] arr = { 2, 1, 2, 1, 1, 1, 3 };
int M = 2, K = 2;
int N = arr.Length;
if (SubarrayRepeatsKorMore(
arr, N, M, K))
{
Console.WriteLine( "Yes" );
}
else {
Console.WriteLine( "No" );
}
} } // This code is contributed by sanjoy_62 |
<script> // Javascript program for the above approach // Function to check if there exists // any subarray of length M repeating // at least K times consecutively function check(arr, M, K, ind)
{ // Iterate from i equal 0 to M
for (let i = 0; i < M; i++)
{
// Iterate from j equals 1 to K
for (let j = 1; j < K; j++)
{
// If elements at pos + i and
// pos + i + j * M are not equal
if (arr[ind + i] !=
arr[ind + i + j * M])
{
return false ;
}
}
}
return true ;
} // Function to check if a subarray repeats // at least K times consecutively or not function SubarrayRepeatsKorMore(arr, N, M, K)
{ // Iterate from ind equal 0 to M
for (let ind = 0;
ind <= N - M * K; ind++)
{
// Check if subarray arr[i, i + M]
// repeats atleast K times or not
if (check(arr, M, K, ind))
{
return true ;
}
}
// Otherwise, return false
return false ;
} // Driver Code let arr = [ 2, 1, 2, 1, 1, 1, 3 ]; let M = 2, K = 2; let N = arr.length; if (SubarrayRepeatsKorMore(arr, N, M, K))
{ document.write( "Yes" );
} else { document.write( "No" );
} // This code is contributed by subhammahato348 </script> |
Yes
Time Complexity: O(N*M*K)
Auxiliary Space: O(1)
Efficient Approach: The above approach can be optimized by using Two Pointers Technique. Follow the steps below to solve the problem:
- Initialize a variable, say count as 0.
-
Traverse the given array arr[] over the range of indices [0, N – M] using a variable, say i, and perform the following steps:
- If the value of arr[i] is equal to arr[i + M], then increment count by 1, as there is a match in the subarray.
- Otherwise, update count to 0 as there is a break in the contiguous subarrays.
- If the value of count is M * (K – 1), then it means that there are K consecutively equal subarrays of length M. Therefore, print “Yes” and break out of the loop.
- After completing the above steps, if the count never becomes M * (K – 1), then print “No”.
Below is the implementation of the above approach:
// C++ program for the above approach #include <bits/stdc++.h> #include <iostream> using namespace std;
// Function to check if any subarray // of length M repeats at least // K times consecutively or not bool checkExists( int arr[], int N,
int M, int K)
{ // Stores the required count
// of repeated subarrays
int count = 0;
for ( int i = 0; i < N - M; i++) {
// Check if the next continuous
// subarray has equal elements
if (arr[i] == arr[i + M])
count++;
else
count = 0;
// Check if K continuous subarray
// of length M are found or not
if (count == M * (K - 1))
return true ;
}
// If no subarrays are found
return false ;
} // Driver Code int main()
{ int arr[] = { 2, 1, 2, 1, 1, 1, 3 };
int N = sizeof (arr) / sizeof (arr[0]);
int M = 2, K = 2;
if (checkExists(arr, N, M, K)) {
cout << "Yes" ;
}
else {
cout << "No" ;
}
return 0;
} |
// Java program for the above approach import java.io.*;
import java.lang.*;
import java.util.*;
class GFG{
// Function to check if any subarray // of length M repeats at least // K times consecutively or not static boolean checkExists( int arr[], int N,
int M, int K)
{ // Stores the required count
// of repeated subarrays
int count = 0 ;
for ( int i = 0 ; i < N - M; i++)
{
// Check if the next continuous
// subarray has equal elements
if (arr[i] == arr[i + M])
count++;
else
count = 0 ;
// Check if K continuous subarray
// of length M are found or not
if (count == M * (K - 1 ))
return true ;
}
// If no subarrays are found
return false ;
} // Driver Code public static void main(String[] args)
{ int arr[] = { 2 , 1 , 2 , 1 , 1 , 1 , 3 };
int M = 2 , K = 2 ;
int N = arr.length;
if (checkExists(arr, N, M, K))
{
System.out.println( "Yes" );
}
else
{
System.out.println( "No" );
}
} } // This code is contributed by Kingash |
# Python3 program for the above approach # Function to check if any subarray # of length M repeats at least # K times consecutively or not def checkExists(arr, N, M, K):
# Stores the required count
# of repeated subarrays
count = 0
for i in range (N - M):
# Check if the next continuous
# subarray has equal elements
if (arr[i] = = arr[i + M]):
count + = 1
else :
count = 0
# Check if K continuous subarray
# of length M are found or not
if (count = = M * (K - 1 )):
return True
# If no subarrays are found
return False
# Driver Code if __name__ = = '__main__' :
arr = [ 2 , 1 , 2 , 1 , 1 , 1 , 3 ]
N = len (arr)
M = 2
K = 2
if (checkExists(arr, N, M, K)):
print ( "Yes" )
else :
print ( "No" )
# This code is contributed by ipg2016107 |
// C# program for the above approach using System;
class GFG{
// Function to check if any subarray // of length M repeats at least // K times consecutively or not public static bool checkExists( int []arr, int N,
int M, int K)
{ // Stores the required count
// of repeated subarrays
int count = 0;
for ( int i = 0; i < N - M; i++)
{
// Check if the next continuous
// subarray has equal elements
if (arr[i] == arr[i + M])
count++;
else
count = 0;
// Check if K continuous subarray
// of length M are found or not
if (count == M * (K - 1))
return true ;
}
// If no subarrays are found
return false ;
} // Driver Code public static void Main()
{ int []arr = { 2, 1, 2, 1, 1, 1, 3 };
int N = arr.Length;
int M = 2, K = 2;
if (checkExists(arr, N, M, K))
{
Console.WriteLine( "Yes" );
}
else
{
Console.WriteLine( "No" );
}
} } // This code is contributed by mohit kumar 29 |
<script> // Javascript program for the above approach // Function to check if any subarray // of length M repeats at least // K times consecutively or not function checkExists(arr, N, M, K)
{ // Stores the required count
// of repeated subarrays
let count = 0;
for (let i = 0; i < N - M; i++) {
// Check if the next continuous
// subarray has equal elements
if (arr[i] == arr[i + M])
count++;
else
count = 0;
// Check if K continuous subarray
// of length M are found or not
if (count == M * (K - 1))
return true ;
}
// If no subarrays are found
return false ;
} // Driver Code let arr = [ 2, 1, 2, 1, 1, 1, 3 ];
let N = arr.length;
let M = 2, K = 2;
if (checkExists(arr, N, M, K)) {
document.write( "Yes" );
}
else {
document.write( "No" );
}
</script> |
Yes
Time Complexity: O(N)
Auxiliary Space: O(1)
Related Topic: Subarrays, Subsequences, and Subsets in Array