Maximum length palindromic substring such that it starts and ends with given char

Given a string str and a character ch, the task is to find the longest palindromic sub-string of str such that it starts and ends with the given character ch.

Examples:

Input: str = “lapqooqpqpl”, ch = ‘p’
Output: 6
“pqooqp” is the maximum length palindromic
sub-string that starts and ends with ‘p’.

Input: str = “geeksforgeeks”, ch = ‘k’
Output: 1
“k” is the valid sub-string.

Approach: For every possible index pair (i, j) such that str[i] = str[j] = ch check whether the sub-string str[i…j] is palindrome or not. For all the found palindromes, store the length of the longest palindrome found so far.

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 that returns true if
// str[i...j] is a palindrome
bool isPalindrome(string str, int i, int j)
{
    while (i < j) {
        if (str[i] != str[j])
            return false;
        i++;
        j--;
    }
    return true;
}
  
// Function to return the length of the
// longest palindromic sub-string such that
// it starts and ends with the character ch
int maxLenPalindrome(string str, int n, char ch)
{
    int maxLen = 0;
  
    for (int i = 0; i < n; i++) {
  
        // If current character is
        // a valid starting index
        if (str[i] == ch) {
  
            // Instead of finding the ending index from
            // the beginning, find the index from the end
            // This is because if the current sub-string
            // is a palindrome then there is no need to check
            // the sub-strings of smaller length and we can
            // skip to the next iteration of the outer loop
            for (int j = n - 1; j >= i; j--) {
  
                // If current character is
                // a valid ending index
                if (str[j] == ch) {
  
                    // If str[i...j] is a palindrome then update
                    // the length of the maximum palindrome so far
                    if (isPalindrome(str, i, j)) {
                        maxLen = max(maxLen, j - i + 1);
                        break;
                    }
                }
            }
        }
    }
    return maxLen;
}
  
// Driver code
int main()
{
    string str = "lapqooqpqpl";
    int n = str.length();
    char ch = 'p';
  
    cout << maxLenPalindrome(str, n, ch);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
class GFG
{
      
    // Function that returns true if 
    // str[i...j] is a palindrome 
    static boolean isPalindrome(String str, 
                               int i, int j) 
    {
        while (i < j)
        {
            if (str.charAt(i) != str.charAt(j))
            {
                return false;
            }
            i++;
            j--;
        }
        return true;
    }
  
    // Function to return the length of the 
    // longest palindromic sub-string such that 
    // it starts and ends with the character ch 
    static int maxLenPalindrome(String str, int n, char ch) 
    {
        int maxLen = 0;
  
        for (int i = 0; i < n; i++)
        {
  
            // If current character is 
            // a valid starting index 
            if (str.charAt(i) == ch)
            {
  
                // Instead of finding the ending index from 
                // the beginning, find the index from the end 
                // This is because if the current sub-string 
                // is a palindrome then there is no need to check 
                // the sub-strings of smaller length and we can 
                // skip to the next iteration of the outer loop 
                for (int j = n - 1; j >= i; j--) 
                {
  
                    // If current character is 
                    // a valid ending index 
                    if (str.charAt(j) == ch) 
                    {
  
                        // If str[i...j] is a palindrome then update 
                        // the length of the maximum palindrome so far 
                        if (isPalindrome(str, i, j)) 
                        {
                            maxLen = Math.max(maxLen, j - i + 1);
                            break;
                        }
                    }
                }
            }
        }
        return maxLen;
    }
  
    // Driver code 
    public static void main(String[] args) 
    {
        String str = "lapqooqpqpl";
        int n = str.length();
        char ch = 'p';
  
        System.out.println(maxLenPalindrome(str, n, ch));
    }
}
  
// This code is contributed by Princi Singh

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python implementation of the approach
  
# Function that returns true if
# str[i...j] is a palindrome
def isPalindrome(str, i, j):
    while (i < j):
        if (str[i] != str[j]):
            return False;
        i+=1;
        j-=1;
    return True;
  
  
# Function to return the length of the
# longest palindromic sub-string such that
# it starts and ends with the character ch
def maxLenPalindrome(str, n, ch):
    maxLen = 0;
  
    for i in range(n):
  
        # If current character is
        # a valid starting index
        if (str[i] == ch):
  
            # Instead of finding the ending index from
            # the beginning, find the index from the end
            # This is because if the current sub-string
            # is a palindrome then there is no need to check
            # the sub-strings of smaller length and we can
            # skip to the next iteration of the outer loop
            for j in range(n-1,i+1,-1):
                # If current character is
                # a valid ending index
                if (str[j] == ch):
  
                    # If str[i...j] is a palindrome then update
                    # the length of the maximum palindrome so far
                    if (isPalindrome(str, i, j)):
                        maxLen = max(maxLen, j - i + 1);
                        break;
  
    return maxLen;
  
# Driver code
str = "lapqooqpqpl";
n = len(str);
ch = 'p';
  
print(maxLenPalindrome(str, n, ch));
      
# This code is contributed by 29AjayKumar

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach 
using System;
  
class GFG 
      
    // Function that returns true if 
    // str[i...j] is a palindrome 
    static bool isPalindrome(string str, 
                            int i, int j) 
    
        while (i < j) 
        
            if (str[i] != str[j]) 
            
                return false
            
            i++; 
            j--; 
        
        return true
    
  
    // Function to return the length of the 
    // longest palindromic sub-string such that 
    // it starts and ends with the character ch 
    static int maxLenPalindrome(string str, int n, char ch) 
    
        int maxLen = 0; 
  
        for (int i = 0; i < n; i++) 
        
  
            // If current character is 
            // a valid starting index 
            if (str[i] == ch) 
            
  
                // Instead of finding the ending index from 
                // the beginning, find the index from the end 
                // This is because if the current sub-string 
                // is a palindrome then there is no need to check 
                // the sub-strings of smaller length and we can 
                // skip to the next iteration of the outer loop 
                for (int j = n - 1; j >= i; j--) 
                
  
                    // If current character is 
                    // a valid ending index 
                    if (str[j] == ch) 
                    
  
                        // If str[i...j] is a palindrome then update 
                        // the length of the maximum palindrome so far 
                        if (isPalindrome(str, i, j)) 
                        
                            maxLen = Math.Max(maxLen, j - i + 1); 
                            break
                        
                    
                
            
        
        return maxLen; 
    
  
    // Driver code 
    public static void Main() 
    
        string str = "lapqooqpqpl"
        int n = str.Length; 
        char ch = 'p'
  
        Console.WriteLine(maxLenPalindrome(str, n, ch)); 
    
  
// This code is contributed by AnkitRai01 

chevron_right


Output:

6


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.