Given string str of lowercase alphabets, the task is to find the length of the longest substring of characters in alphabetical order i.e. string “dfabck” will return 3. Note that the alphabetical order here is considered circular i.e. a, b, c, d, e, …, x, y, z, a, b, c, ….
Examples:
Input: str = “abcabcdefabc”
Output: 6
All valid sub-strings are “abc”, “abcdef” and “abc”
And, the length of the longest of these is 6
Input: str = “zabcd”
Output: 5
Approach:
- Initialize i = 0 and len = 0 and starting from i find the ending index of the longest valid sub-string and store it, in end.
- Now, update len = max(end – i + 1, len) and i = end + 1 (to get the next valid sub-string starting from the index end + 1) and repeat step 1 until i < len(str).
- Print the value of len in the end.
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
int getEndingIndex(string str, int n, int i)
{
i++;
while (i < n)
{
char curr = str[i];
char prev = str[i-1];
if ((curr == 'a' && prev == 'z' ) ||
(curr - prev == 1))
i++;
else
break ;
}
return i - 1;
}
int largestSubStr(string str, int n)
{
int len = 0;
int i = 0;
while (i < n)
{
int end = getEndingIndex(str, n, i);
len = max(end - i + 1, len);
i = end + 1;
}
return len;
}
int main()
{
string str = "abcabcdefabc" ;
int n = str.length();
cout << (largestSubStr(str, n));
}
|
Java
class GFG {
static int getEndingIndex(String str, int n, int i)
{
i++;
while (i < n) {
char curr = str.charAt(i);
char prev = str.charAt(i - 1 );
if ((curr == 'a' && prev == 'z' ) ||
(curr - prev == 1 ))
i++;
else
break ;
}
return i - 1 ;
}
static int largestSubStr(String str, int n)
{
int len = 0 ;
int i = 0 ;
while (i < n) {
int end = getEndingIndex(str, n, i);
len = Math.max(end - i + 1 , len);
i = end + 1 ;
}
return len;
}
public static void main(String args[])
{
String str = "abcabcdefabc" ;
int n = str.length();
System.out.print(largestSubStr(str, n));
}
}
|
Python3
def getEndingIndex(str1, n, i):
i + = 1
while (i < n):
curr = str1[i]
prev = str1[i - 1 ]
if ((curr = = 'a' and prev = = 'z' ) or
( ord (curr) - ord (prev) = = 1 )):
i + = 1
else :
break
return i - 1
def largestSubstr1(str1, n):
Len = 0
i = 0
while (i < n):
end = getEndingIndex(str1, n, i)
Len = max (end - i + 1 , Len )
i = end + 1
return Len
str1 = "abcabcdefabc"
n = len (str1)
print (largestSubstr1(str1, n))
|
C#
using System;
class GFG
{
static int getEndingIndex( string str, int n, int i)
{
i++;
while (i < n)
{
char curr = str[i];
char prev = str[i - 1];
if ((curr == 'a' && prev == 'z' ) ||
(curr - prev == 1))
i++;
else
break ;
}
return i - 1;
}
static int largestSubStr( string str, int n)
{
int len = 0;
int i = 0;
while (i < n)
{
int end = getEndingIndex(str, n, i);
len = Math.Max(end - i + 1, len);
i = end + 1;
}
return len;
}
public static void Main()
{
string str = "abcabcdefabc" ;
int n = str.Length;
Console.Write(largestSubStr(str, n));
}
}
|
PHP
<?php
function getEndingIndex( $str , $n , $i )
{
$i ++;
while ( $i < $n )
{
$curr = $str [ $i ];
$prev = $str [ $i - 1];
if (( $curr == 'a' && $prev == 'z' ) ||
(ord( $curr ) - ord( $prev ) == 1))
$i ++;
else
break ;
}
return $i - 1;
}
function largestSubStr( $str , $n )
{
$len = 0;
$i = 0;
while ( $i < $n )
{
$end = getEndingIndex( $str , $n , $i );
$len = max( $end - $i + 1, $len );
$i = $end + 1;
}
return $len ;
}
$str = "abcabcdefabc" ;
$n = strlen ( $str );
echo largestSubStr( $str , $n );
?>
|
Javascript
<script>
function getEndingIndex(str,n,i)
{
i++;
while (i < n) {
let curr = str[i];
let prev = str[i - 1];
if ((curr == 'a' && prev == 'z' ) ||
(curr.charCodeAt(0) - prev.charCodeAt(0) == 1))
i++;
else
break ;
}
return i - 1;
}
function largestSubStr(str,n)
{
let len = 0;
let i = 0;
while (i < n) {
let end = getEndingIndex(str, n, i);
len = Math.max(end - i + 1, len);
i = end + 1;
}
return len;
}
let str = "abcabcdefabc" ;
let n = str.length;
document.write(largestSubStr(str, n));
</script>
|
Time Complexity: O(n) where n is the length of the input string. Note that we increase the index by the end.
Space Complexity: O(1)