Longest substring consisting of vowels using Binary Search
Last Updated :
03 Mar, 2023
Given string str of length N, the task is to find the longest substring which contains only vowels using the Binary Search technique.
Examples:
Input: str = “baeicba”
Output: 3
Explanation:
Longest substring which contains vowels only is “aei”.
Input: str = “aeiou”
Output: 5
Approach: Refer to the Longest substring of vowels for an approach in O(N) complexity.
Binary Search Approach: In this article, we are using a Binary Search based approach:
Follow the steps below to solve the problem:
- Apply binary search on the lengths ranging from 1 to N.
- For each mid-value check if there exists a substring of length mid consisting only of vowels in that substring.
- If there exists a substring of length mid, then update the value of max and update l as mid+1 to check if a substring of length greater than mid exists or not which consists only of vowels.
- If no such substring of length mid exists, update r as mid-1 to check if a substring of length smaller than mid exists or not which consists only of vowels.
- Repeat the above three steps until l is less than or equal to r.
- Return the max length obtained finally.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
bool vowel( int vo)
{
if (vo == 0 || vo == 4
|| vo == 8 || vo == 14
|| vo == 20)
return true ;
else
return false ;
}
bool check(string s, int k)
{
vector< int > cnt(26, 0);
for ( int i = 0; i < k - 1; i++) {
cnt[s[i] - 'a' ]++;
}
for ( int i = k - 1; i < s.size();
i++) {
cnt[s[i] - 'a' ]++;
int flag1 = 0;
for ( int j = 0; j < 26; j++) {
if (vowel(j) == false
&& cnt[j] > 0) {
flag1 = 1;
break ;
}
}
if (flag1 == 0)
return true ;
cnt[s[i - k + 1] - 'a' ]--;
}
return false ;
}
int longestSubstring(string s)
{
int l = 1, r = s.size();
int maxi = 0;
while (l <= r) {
int mid = (l + r) / 2;
if (check(s, mid)) {
l = mid + 1;
maxi = max(maxi, mid);
}
else
r = mid - 1;
}
return maxi;
}
int main()
{
string s = "sedrewaefhoiu" ;
cout << longestSubstring(s);
return 0;
}
|
Java
import java.util.*;
class GFG{
static boolean vowel( int vo)
{
if (vo == 0 || vo == 4 ||
vo == 8 || vo == 14 ||
vo == 20 )
return true ;
else
return false ;
}
static boolean check(String s, int k)
{
int []cnt = new int [ 26 ];
for ( int i = 0 ; i < k - 1 ; i++)
{
cnt[s.charAt(i) - 'a' ]++;
}
for ( int i = k - 1 ; i < s.length(); i++)
{
cnt[s.charAt(i) - 'a' ]++;
int flag1 = 0 ;
for ( int j = 0 ; j < 26 ; j++)
{
if (vowel(j) == false && cnt[j] > 0 )
{
flag1 = 1 ;
break ;
}
}
if (flag1 == 0 )
return true ;
cnt[s.charAt(i - k + 1 ) - 'a' ]--;
}
return false ;
}
static int longestSubString(String s)
{
int l = 1 , r = s.length();
int maxi = 0 ;
while (l <= r)
{
int mid = (l + r) / 2 ;
if (check(s, mid))
{
l = mid + 1 ;
maxi = Math.max(maxi, mid);
}
else
r = mid - 1 ;
}
return maxi;
}
public static void main(String[] args)
{
String s = "sedrewaefhoiu" ;
System.out.print(longestSubString(s));
}
}
|
Python3
def vowel(vo):
if (vo = = 0 or vo = = 4 or
vo = = 8 or vo = = 14 or
vo = = 20 ):
return True
else :
return False
def check(s, k):
cnt = [ 0 ] * 26
for i in range (k - 1 ):
cnt[ ord (s[i]) - ord ( 'a' )] + = 1
for i in range (k - 1 , len (s)):
cnt[ ord (s[i]) - ord ( 'a' )] + = 1
flag1 = 0
for j in range ( 26 ):
if (vowel(j) = = False
and cnt[j] > 0 ):
flag1 = 1
break
if (flag1 = = 0 ):
return True
cnt[ ord (s[i - k + 1 ]) - ord ( 'a' )] - = 1
return False
def longestSubstring(s):
l = 1
r = len (s)
maxi = 0
while (l < = r):
mid = (l + r) / / 2
if (check(s, mid)):
l = mid + 1
maxi = max (maxi, mid)
else :
r = mid - 1
return maxi
if __name__ = = "__main__" :
s = "sedrewaefhoiu"
print (longestSubstring(s))
|
C#
using System;
class GFG{
static bool vowel( int vo)
{
if (vo == 0 || vo == 4 ||
vo == 8 || vo == 14 ||
vo == 20)
return true ;
else
return false ;
}
static bool check(String s, int k)
{
int []cnt = new int [26];
for ( int i = 0; i < k - 1; i++)
{
cnt[s[i] - 'a' ]++;
}
for ( int i = k - 1; i < s.Length; i++)
{
cnt[s[i] - 'a' ]++;
int flag1 = 0;
for ( int j = 0; j < 26; j++)
{
if (vowel(j) == false && cnt[j] > 0)
{
flag1 = 1;
break ;
}
}
if (flag1 == 0)
return true ;
cnt[s[i - k + 1] - 'a' ]--;
}
return false ;
}
static int longestSubString(String s)
{
int l = 1, r = s.Length;
int maxi = 0;
while (l <= r)
{
int mid = (l + r) / 2;
if (check(s, mid))
{
l = mid + 1;
maxi = Math.Max(maxi, mid);
}
else
r = mid - 1;
}
return maxi;
}
public static void Main(String[] args)
{
String s = "sedrewaefhoiu" ;
Console.Write(longestSubString(s));
}
}
|
Javascript
function vowel(vo) {
if (vo == 0 || vo == 4 || vo == 8 || vo == 14 || vo == 20) {
return true ;
} else {
return false ;
}
}
function check(s, k) {
let cnt = new Array(26).fill(0);
for (let i = 0; i < k - 1; i++) {
cnt[s.charCodeAt(i) - 'a' .charCodeAt(0)] += 1;
}
for (let i = k - 1; i < s.length; i++) {
cnt[s.charCodeAt(i) - 'a' .charCodeAt(0)] += 1;
let flag1 = 0;
for (let j = 0; j < 26; j++) {
if (vowel(j) == false && cnt[j] > 0) {
flag1 = 1;
break ;
}
}
if (flag1 == 0) {
return true ;
}
cnt[s.charCodeAt(i - k + 1) - 'a' .charCodeAt(0)] -= 1;
}
return false ;
}
function longestSubstring(s) {
let l = 1;
let r = s.length;
let maxi = 0;
while (l <= r) {
let mid = Math.floor((l + r) / 2);
if (check(s, mid)) {
l = mid + 1;
maxi = Math.max(maxi, mid);
} else {
r = mid - 1;
}
}
return maxi;
}
let s = "sedrewaefhoiu" ;
console.log(longestSubstring(s));
|
Time Complexity: O(NlogN)
Auxiliary Space: O(26) => O(1), no extra space is required, so it is a constant.
Share your thoughts in the comments
Please Login to comment...