Given string str, the task is to find the length of the longest substring of str such that no three consecutive characters in the substring are same.
Examples:
Input: str = “baaabbabbb”
Output: 7
“aabbabb” is the required substring.
Input: str = “babba”
Output: 5
Given string itself is the longest substring.
Approach: The following steps can be followed to solve the problem:
- If the length of the given string is less than 3 then the length of the string will be the answer.
- Initialize temp and ans as 2 initially, since this is the minimum length of the longest substring when the length of the given string is greater than 2.
- Iterate in the string from 2 to N – 1 and increment temp by 1 if str[i] != str[i – 1] or str[i] != str[i – 2].
- Else re-initialize temp = 2 and ans = max(ans, temp).
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std;
// Function to return the length of the // longest substring such that no three // consecutive characters are same int maxLenSubStr(string& s)
{ // If the length of the given string
// is less than 3
if (s.length() < 3)
return s.length();
// Initialize temporary and final ans
// to 2 as this is the minimum length
// of substring when length of the given
// string is greater than 2
int temp = 2;
int ans = 2;
// Traverse the string from the
// third character to the last
for ( int i = 2; i < s.length(); i++) {
// If no three consecutive characters
// are same then increment temporary count
if (s[i] != s[i - 1] || s[i] != s[i - 2])
temp++;
// Else update the final ans and
// reset the temporary count
else {
ans = max(temp, ans);
temp = 2;
}
}
ans = max(temp, ans);
return ans;
} // Driver code int main()
{ string s = "baaabbabbb" ;
cout << maxLenSubStr(s);
return 0;
} |
Java
// Java implementation of the approach import java.util.*;
class GFG
{ // Function to return the length of the // longest substring such that no three // consecutive characters are same static int maxLenSubStr(String s)
{ // If the length of the given string
// is less than 3
if (s.length() < 3 )
return s.length();
// Initialize temporary and final ans
// to 2 as this is the minimum length
// of substring when length of the given
// string is greater than 2
int temp = 2 ;
int ans = 2 ;
// Traverse the string from the
// third character to the last
for ( int i = 2 ; i < s.length(); i++)
{
// If no three consecutive characters
// are same then increment temporary count
if (s.charAt(i) != s.charAt(i - 1 ) ||
s.charAt(i) != s.charAt(i - 2 ))
temp++;
// Else update the final ans and
// reset the temporary count
else
{
ans = Math.max(temp, ans);
temp = 2 ;
}
}
ans = Math.max(temp, ans);
return ans;
} // Driver code public static void main(String[] args)
{ String s = "baaabbabbb" ;
System.out.println(maxLenSubStr(s));
} } // This code is contributed by PrinciRaj1992 |
Python3
# Python3 implementation of the approach # Function to return the length of the # longest substring such that no three # consecutive characters are same def maxLenSubStr(s):
# If the length of the given string
# is less than 3
if ( len (s) < 3 ):
return len (s)
# Initialize temporary and final ans
# to 2 as this is the minimum length
# of substring when length of the given
# string is greater than 2
temp = 2
ans = 2
# Traverse the string from the
# third character to the last
for i in range ( 2 , len (s)):
# If no three consecutive characters
# are same then increment temporary count
if (s[i] ! = s[i - 1 ] or s[i] ! = s[i - 2 ]):
temp + = 1
# Else update the final ans and
# reset the temporary count
else :
ans = max (temp, ans)
temp = 2
ans = max (temp, ans)
return ans
# Driver code s = "baaabbabbb"
print (maxLenSubStr(s))
# This code is contributed by Mohit Kumar |
C#
// C# implementation of the approach using System;
class GFG
{ // Function to return the length of the // longest substring such that no three // consecutive characters are same static int maxLenSubStr(String s)
{ // If the length of the given string
// is less than 3
if (s.Length < 3)
return s.Length;
// Initialize temporary and final ans
// to 2 as this is the minimum length
// of substring when length of the given
// string is greater than 2
int temp = 2;
int ans = 2;
// Traverse the string from the
// third character to the last
for ( int i = 2; i < s.Length; i++)
{
// If no three consecutive characters
// are same then increment temporary count
if (s[i] != s[i - 1] ||
s[i] != s[i - 2])
temp++;
// Else update the final ans and
// reset the temporary count
else
{
ans = Math.Max(temp, ans);
temp = 2;
}
}
ans = Math.Max(temp, ans);
return ans;
} // Driver code static public void Main ()
{ String s = "baaabbabbb" ;
Console.Write(maxLenSubStr(s));
} } // This code is contributed by ajit. |
Javascript
<script> // Javascript implementation of the approach
// Function to return the length of the
// longest substring such that no three
// consecutive characters are same
function maxLenSubStr(s)
{
// If the length of the given string
// is less than 3
if (s.length < 3)
return s.length;
// Initialize temporary and final ans
// to 2 as this is the minimum length
// of substring when length of the given
// string is greater than 2
let temp = 2;
let ans = 2;
// Traverse the string from the
// third character to the last
for (let i = 2; i < s.length; i++)
{
// If no three consecutive characters
// are same then increment temporary count
if (s[i] != s[i - 1] ||
s[i] != s[i - 2])
temp++;
// Else update the final ans and
// reset the temporary count
else
{
ans = Math.max(temp, ans);
temp = 2;
}
}
ans = Math.max(temp, ans);
return ans;
}
let s = "baaabbabbb" ;
document.write(maxLenSubStr(s));
</script> |
Output:
7
Time Complexity: O(N) where N is the length of the string.
Space Complexity: O(1)