Length of the longest substring with consecutive characters

Given a string str of lowercase alphabets, the task is to find the length of the longest sub-string 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:

  1. 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.
  2. 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).
  3. Print the value of len in the end.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include<bits/stdc++.h>
using namespace std;
  
    // Function to return the ending index for the
    // largest valid sub-string starting from index i
    int getEndingIndex(string str, int n, int i)
    {
        i++;
        while (i < n) 
        {
            char curr = str[i];
            char prev = str[i-1];
  
            // If the current character appears after
            // the previous character according to 
            // the given circular alphabetical order
            if ((curr == 'a' && prev == 'z') ||
                (curr - prev == 1))
                i++;
            else
                break;
        }
  
        return i - 1;
    }
  
    // Function to return the length of the longest
    // sub-string of consecutive characters from str
    int largestSubStr(string str, int n)
    {
        int len = 0;
  
        int i = 0;
        while (i < n) 
        {
  
            // Valid sub-string exists from index
            // i to end
            int end = getEndingIndex(str, n, i);
  
            // Update the length
            len = max(end - i + 1, len);
            i = end + 1;
        }
  
        return len;
    }
  
    // Driver code
    int main()
    {
        string str = "abcabcdefabc";
        int n = str.length();
        cout << (largestSubStr(str, n));
    }
  
// This code is contributed by 
// Surendra_Gangwar

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
class GFG {
  
    // Function to return the ending index for the
    // largest valid sub-string starting from index i
    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 the current character appears after
            // the previous character  according to 
            // the given circular alphabetical order
            if ((curr == 'a' && prev == 'z') ||
                (curr - prev == 1))
                i++;
            else
                break;
        }
  
        return i - 1;
    }
  
    // Function to return the length of the longest
    // sub-string of consecutive characters from str
    static int largestSubStr(String str, int n)
    {
        int len = 0;
  
        int i = 0;
        while (i < n) {
  
            // Valid sub-string exists from index
            // i to end
            int end = getEndingIndex(str, n, i);
  
            // Update the length
            len = Math.max(end - i + 1, len);
            i = end + 1;
        }
  
        return len;
    }
  
    // Driver code
    public static void main(String args[])
    {
        String str = "abcabcdefabc";
        int n = str.length();
  
        System.out.print(largestSubStr(str, n));
    }
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach
  
# Function to return the ending index for the
# largest valid sub-str1ing starting from index i
def getEndingIndex(str1, n, i):
  
    i += 1
    while (i < n): 
      
        curr = str1[i]
        prev = str1[i - 1]
  
        # If the current character appears after
        # the previous character according to 
        # the given circular alphabetical order
        if ((curr == 'a' and prev == 'z') or 
            (ord(curr) - ord(prev) == 1)):
            i += 1
        else:
            break
      
    return i - 1
  
# Function to return the length of the 
# longest sub-str1ing of consecutive
# characters from str1
def largestSubstr1(str1, n):
  
    Len = 0
  
    i = 0
    while (i < n):
      
        # Valid sub-str1ing exists from 
        # index i to end
        end = getEndingIndex(str1, n, i)
  
        # Update the Length
        Len = max(end - i + 1, Len)
        i = end + 1
      
    return Len
  
# Driver code
str1 = "abcabcdefabc"
n = len(str1)
print(largestSubstr1(str1, n))
  
# This code is contributed by 
# Mohit Kumar 29

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach
using System;
  
class GFG 
{
  
    // Function to return the ending index for the
    // largest valid sub-string starting from index i
    static int getEndingIndex(string str, int n, int i)
    {
        i++;
        while (i < n) 
        {
            char curr = str[i];
            char prev = str[i - 1];
  
            // If the current character appears after
            // the previous character according to 
            // the given circular alphabetical order
            if ((curr == 'a' && prev == 'z') ||
                (curr - prev == 1))
                i++;
            else
                break;
        }
        return i - 1;
    }
  
    // Function to return the length of the longest
    // sub-string of consecutive characters from str
    static int largestSubStr(string str, int n)
    {
        int len = 0;
  
        int i = 0;
        while (i < n) 
        {
  
            // Valid sub-string exists from index
            // i to end
            int end = getEndingIndex(str, n, i);
  
            // Update the length
            len = Math.Max(end - i + 1, len);
            i = end + 1;
        }
        return len;
    }
  
    // Driver code
    public static void Main()
    {
        string str = "abcabcdefabc";
        int n = str.Length;
        Console.Write(largestSubStr(str, n));
    }
}
  
// This code is contributed 
// by Akanksha Rai

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP implementation of the approach 
  
// Function to return the ending index 
// for the largest valid sub-string
/// starting from index i 
function getEndingIndex($str, $n, $i
    $i++; 
    while ($i < $n
    
        $curr = $str[$i]; 
        $prev = $str[$i - 1]; 
  
        // If the current character appears after 
        // the previous character according to 
        // the given circular alphabetical order 
        if (($curr == 'a' && $prev == 'z') || 
            (ord($curr) - ord($prev) == 1)) 
            $i++; 
        else
            break
    
  
    return $i - 1; 
  
// Function to return the length of the longest 
// sub-string of consecutive characters from str 
function largestSubStr($str, $n
    $len = 0; 
  
    $i = 0; 
    while ($i < $n
    
  
        // Valid sub-string exists from index 
        // i to end 
        $end = getEndingIndex($str, $n, $i); 
  
        // Update the length 
        $len = max($end - $i + 1, $len); 
        $i = $end + 1; 
    
  
    return $len
  
// Driver code 
$str = "abcabcdefabc"
$n = strlen($str); 
echo largestSubStr($str, $n); 
  
// This code is contributed by Ryuga
?>

chevron_right


Output:

6

Time Complexity : O(n) where n is length of the input string. Note that we increase index by end.



My Personal Notes arrow_drop_up

Front and Back End Web Developer Android Developer Python and C++ Coder Networking Geek

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.