Longest substring that starts with X and ends with Y

Given a string str, two characters X and Y. The task is to find the length of the longest substring that starts with X and ends with Y. It is given that there always exists a substring that starts with X and ends with Y
Examples: 

Input: str = “QWERTYASDFZXCV”, X = ‘A’, Y = ‘Z’ 
Output:
Explanation: 
The largest substring which start with ‘A’ and end with ‘Z’ = “ASDFZ”. 
Size of the substring = 5.

Input: str = “ZABCZ”, X = ‘Z’, Y = ‘Z’ 
Output:
Explanation: 
The largest substring which start with ‘Z’ and end with ‘Z’ = “ZABCZ”. 
Size of the substring = 5. 

Naive Approach: The naive approach is to find all the substrings of the given string out of these find the largest substring which starts with X and ends with Y
Time Complexity: O(N2
Auxiliary Space: O(1)

Efficient Approach: To optimized the above approach, the count of characters between X and Y should be the largest. So, iterate over the string using pointers start and end to find the first occurrence of X from the starting index and the last occurrence of Y from the end. Below are the steps: 

  1. Initialize start = 0 and end = length of string – 1.
  2. Traverse the string from the beginning and find the first occurrence of character X. Let it be at index xPos.
  3. Traverse the string from the beginning and find the last occurrence of character Y. Let it be at index yPos.
  4. The length of the longest substring is given by (yPos – xPos + 1).

Below is the implementation of the above approach:



C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach 
#include <bits/stdc++.h> 
using namespace std; 
  
// Function returns length of longest 
// substring starting with X and 
// ending with Y 
int longestSubstring(string str, 
                    char X, char Y) 
    // Length of string 
    int N = str.length(); 
    int start = 0; 
    int end = N - 1; 
    int xPos = 0; 
    int yPos = 0; 
  
    // Find the length of the string 
    // starting with X from the beginning 
    while (true) { 
  
        if (str[start] == X) { 
            xPos = start; 
            break
        
        start++; 
    
  
    // Find the length of the string 
    // ending with Y from the end 
    while (true) { 
  
        if (str[end] == Y) { 
            yPos = end; 
            break
        
        end--; 
    
  
    // Longest substring 
    int length = (yPos - xPos) + 1; 
  
    // Print the length 
    cout << length; 
  
// Driver Code 
int main() 
    // Given string str 
    string str = "HASFJGHOGAKZZFEGA"
  
    // Starting and Ending characters 
    char X = 'A', Y = 'Z'
  
    // Function Call 
    longestSubstring(str, X, Y); 
    return 0; 

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program for the above approach 
class GFG{
      
// Function returns length of longest 
// substring starting with X and 
// ending with Y 
public static void longestSubstring(String str, 
                                    char X, char Y) 
      
    // Length of string 
    int N = str.length(); 
    int start = 0
    int end = N - 1
    int xPos = 0
    int yPos = 0
      
    // Find the length of the string 
    // starting with X from the beginning 
    while (true)
    
        if (str.charAt(start) == X)
        
            xPos = start; 
            break
        
        start++; 
    
      
    // Find the length of the string 
    // ending with Y from the end 
    while (true)
    
        if (str.charAt(end) == Y)
        
            yPos = end; 
            break
        
        end--; 
    
      
    // Longest substring 
    int length = (yPos - xPos) + 1
      
    // Print the length 
    System.out.print(length);
  
// Driver code
public static void main(String[] args)
{
      
    // Given string str 
    String str = "HASFJGHOGAKZZFEGA"
      
    // Starting and Ending characters 
    char X = 'A', Y = 'Z'
      
    // Function Call 
    longestSubstring(str, X, Y); 
}
}
  
// This code is contributed by divyeshrabadiya07

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program for the above approach 
  
# Function returns length of longest 
# substring starting with X and 
# ending with Y 
def longestSubstring(str, X, Y): 
      
    # Length of string 
    N = len(str)
      
    start = 0
    end = N - 1
    xPos = 0
    yPos = 0
  
    # Find the length of the string 
    # starting with X from the beginning 
    while (True): 
        if (str[start] == X): 
            xPos = start 
            break
              
        start += 1
  
    # Find the length of the string 
    # ending with Y from the end 
    while (True): 
        if (str[end] == Y): 
            yPos = end 
            break
          
        end -= 1
  
    # Longest substring 
    length = (yPos - xPos) + 1
  
    # Print the length 
    print(length)
  
# Driver Code 
if __name__ == "__main__":
      
    # Given string str 
    str = "HASFJGHOGAKZZFEGA"
  
    # Starting and Ending characters 
    X = 'A'
    Y = 'Z'
  
    # Function Call 
    longestSubstring(str, X, Y) 
  
# This code is contributed by sanjoy_62

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program for the above approach  
using System;
  
class GFG{
      
// Function returns length of longest 
// substring starting with X and 
// ending with Y 
static void longestSubstring(string str, 
                             char X, char Y) 
      
    // Length of string 
    int N = str.Length; 
    int start = 0; 
    int end = N - 1; 
    int xPos = 0; 
    int yPos = 0; 
      
    // Find the length of the string 
    // starting with X from the beginning 
    while (true)
    
        if (str[start] == X)
        
            xPos = start; 
            break
        
        start++; 
    
      
    // Find the length of the string 
    // ending with Y from the end 
    while (true)
    
        if (str[end] == Y)
        
            yPos = end; 
            break
        
        end--; 
    
      
    // Longest substring 
    int length = (yPos - xPos) + 1; 
      
    // Print the length 
    Console.Write(length);
  
// Driver code
public static void Main()
{
      
    // Given string str 
    string str = "HASFJGHOGAKZZFEGA"
      
    // Starting and Ending characters 
    char X = 'A', Y = 'Z'
      
    // Function call 
    longestSubstring(str, X, Y); 
}
}
  
// This code is contributed by sanjoy_62

chevron_right


Output: 

12

Time Complexity: O(N) 
Auxiliary Space: O(1)
 

competitive-programming-img




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

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.