Open In App

Length of longest palindromic sub-string : Recursion

Last Updated : 18 Mar, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

Given a string S, the task is to find the length of the longest sub-string which is a palindrome
Examples: 

Input: S = "aaaabbaa" 
Output:
Explanation: Sub-string "aabbaa" is the longest palindromic sub-string.

Input: S = "banana" 
Output:
Explanation: Sub-string "anana" is the longest palindromic sub-string. 

Approach- Using Recursion

The idea is to use recursion to break the problem into smaller sub-problems. To break the problem into two smaller sub-problems, Compare the start and end characters of the string untill the starting index of the string is greater than or equal to the ending index. 

  • If the starting and ending characters are equal, then recursively call for the substring by excluding the starting and ending characters.
  • If starting and ending characters are not equal, then recursively call for the substring by excluding the starting and ending characters one at a time. 
C++
#include <bits/stdc++.h>
using namespace std;


// Function to find the longest
// palindromic substring : Recursion
int longestPalindromic(string str, int i, int j, int count)
{
    
    // Base condition when the start
    // index is greater than end index
    if (i > j)
        return count;
    
    // Base condition when both the 
    // start and end index are equal
    if (i == j)
        return (count + 1);
        
    // Condition when corner characters
    // are equal in the string
    if (str[i] == str[j]) {
        
        // Recursive call to find the
        // longest Palindromic string
        // by excluding the corner characters
        count = longestPalindromic(str, i + 1, 
                            j - 1, count + 2);
        return max(count, 
        max(longestPalindromic(str, i + 1, j, 0), 
         longestPalindromic(str, i, j - 1, 0)));
    }
    
    // Recursive call to find the 
    // longest Palindromic string
    // by including one corner 
    // character at a time
    return max(
       longestPalindromic(str, i + 1, j, 0), 
       longestPalindromic(str, i, j - 1, 0));
}

int main()
{
    string str = "aaaabbaa";
    int n = str.length();
    
    // Function Call
    cout << longestPalindromic(str, 0, n - 1, 0);
    return 0;
}
Java
public class GfG {
    public static int longestPalindromic(String str, int i, int j, int count) {
        // Base condition when the start
        // index is greater than end index
        if (i > j)
            return count;

        // Base condition when both the 
        // start and end index are equal
        if (i == j)
            return (count + 1);

        // Condition when corner characters
        // are equal in the string
        if (str.charAt(i) == str.charAt(j)) {
            // Recursive call to find the
            // longest Palindromic string
            // by excluding the corner characters
            count = longestPalindromic(str, i + 1, j - 1, count + 2);
            return Math.max(count, Math.max(longestPalindromic(str, i + 1, j, 0), longestPalindromic(str, i, j - 1, 0)));
        }

        // Recursive call to find the 
        // longest Palindromic string
        // by including one corner 
        // character at a time
        return Math.max(longestPalindromic(str, i + 1, j, 0), longestPalindromic(str, i, j - 1, 0));
    }

    public static void main(String[] args) {
        String str = "aaaabbaa";
        int n = str.length();

        // Function Call
        System.out.println(longestPalindromic(str, 0, n - 1, 0));
    }
}
Python
def longest_palindromic(str, i, j, count):
    # Base condition when the start
    # index is greater than end index
    if i > j:
        return count

    # Base condition when both the 
    # start and end index are equal
    if i == j:
        return count + 1

    # Condition when corner characters
    # are equal in the string
    if str[i] == str[j]:
        # Recursive call to find the
        # longest Palindromic string
        # by excluding the corner characters
        count = longest_palindromic(str, i + 1, j - 1, count + 2)
        return max(count, max(longest_palindromic(str, i + 1, j, 0), longest_palindromic(str, i, j - 1, 0)))

    # Recursive call to find the 
    # longest Palindromic string
    # by including one corner 
    # character at a time
    return max(longest_palindromic(str, i + 1, j, 0), longest_palindromic(str, i, j - 1, 0))

str = "aaaabbaa"
n = len(str)

# Function Call
print(longest_palindromic(str, 0, n - 1, 0))
C#
using System;

class GfG {
    public static int LongestPalindromic(string str, int i, int j, int count) {
        // Base condition when the start
        // index is greater than end index
        if (i > j)
            return count;

        // Base condition when both the 
        // start and end index are equal
        if (i == j)
            return count + 1;

        // Condition when corner characters
        // are equal in the string
        if (str[i] == str[j]) {
            // Recursive call to find the
            // longest Palindromic string
            // by excluding the corner characters
            count = LongestPalindromic(str, i + 1, j - 1, count + 2);
            return Math.Max(count, Math.Max(LongestPalindromic(str, i + 1, j, 0), LongestPalindromic(str, i, j - 1, 0)));
        }

        // Recursive call to find the 
        // longest Palindromic string
        // by including one corner 
        // character at a time
        return Math.Max(LongestPalindromic(str, i + 1, j, 0), LongestPalindromic(str, i, j - 1, 0));
    }

    public static void Main() {
        string str = "aaaabbaa";
        int n = str.Length;

        // Function Call
        Console.WriteLine(LongestPalindromic(str, 0, n - 1, 0));
    }
}
JavaScript
function longestPalindromic(str, i, j, count) {
    // Base condition when the start
    // index is greater than end index
    if (i > j)
        return count;

    // Base condition when both the 
    // start and end index are equal
    if (i === j)
        return count + 1;

    // Condition when corner characters
    // are equal in the string
    if (str[i] === str[j]) {
        // Recursive call to find the
        // longest Palindromic string
        // by excluding the corner characters
        count = longestPalindromic(str, i + 1, j - 1, count + 2);
        return Math.max(count, Math.max(longestPalindromic(str, i + 1, j, 0), longestPalindromic(str, i, j - 1, 0)));
    }

    // Recursive call to find the 
    // longest Palindromic string
    // by including one corner 
    // character at a time
    return Math.max(longestPalindromic(str, i + 1, j, 0), longestPalindromic(str, i, j - 1, 0));
}

let str = "aaaabbaa";
let n = str.length;

// Function Call
console.log(longestPalindromic(str, 0, n - 1, 0));

Output
6


Please note that the above solution can be optimized. Please refer Longest Palindromic Substring for more details.


Next Article

Similar Reads