Longest substring consisting of vowels using Binary Search
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.
Last Updated :
03 Mar, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...