Longest Palindromic Substring | Set 1

06 Jul, 2022
Given a string, find the longest substring which is a palindrome. 
For example, 
Input: Given string :"forgeeksskeegfor", 
Output: "geeksskeeg"

Input: Given string :"Geeks", 
Output: "ee"
Method 1: Brute Force. Approach: The simple approach is to check each substring whether the substring is a palindrome or not. To do this first, run three nested loops, the outer two loops pick all substrings one by one by fixing the corner characters, the inner loop checks whether the picked substring is palindrome or not. 
C++
Java
Python3
C#
Javascript
// A C++ solution for longest palindrome#include <bits/stdc++.h>using namespace std; // Function to print a substring str[low..high]void printSubStr(string str, int low, int high){    for (int i = low; i <= high; ++i)        cout << str[i];} // This function prints the// longest palindrome substring// It also returns the length// of the longest palindromeint longestPalSubstr(string str){    // get length of input string    int n = str.size();     // All substrings of length 1    // are palindromes    int maxLength = 1, start = 0;     // Nested loop to mark start and end index    for (int i = 0; i < str.length(); i++) {        for (int j = i; j < str.length(); j++) {            int flag = 1;             // Check palindrome            for (int k = 0; k < (j - i + 1) / 2; k++)                if (str[i + k] != str[j - k])                    flag = 0;             // Palindrome            if (flag && (j - i + 1) > maxLength) {                start = i;                maxLength = j - i + 1;            }        }    }     cout << "Longest palindrome substring is: ";    printSubStr(str, start, start + maxLength - 1);     // return length of LPS    return maxLength;} // Driver Codeint main(){    string str = "forgeeksskeegfor";    cout << "\nLength is: "         << longestPalSubstr(str);    return 0;}
// A Java solution for longest palindromeimport java.util.*; class GFG{ // Function to print a subString str[low..high]static void printSubStr(String str, int low, int high){    for (int i = low; i <= high; ++i)        System.out.print(str.charAt(i));} // This function prints the// longest palindrome subString// It also returns the length// of the longest palindromestatic int longestPalSubstr(String str){    // get length of input String    int n = str.length();     // All subStrings of length 1    // are palindromes    int maxLength = 1, start = 0;     // Nested loop to mark start and end index    for (int i = 0; i < str.length(); i++) {        for (int j = i; j < str.length(); j++) {            int flag = 1;             // Check palindrome            for (int k = 0; k < (j - i + 1) / 2; k++)                if (str.charAt(i + k) != str.charAt(j - k))                    flag = 0;             // Palindrome            if (flag!=0 && (j - i + 1) > maxLength) {                start = i;                maxLength = j - i + 1;            }        }    }     System.out.print("Longest palindrome subString is: ");    printSubStr(str, start, start + maxLength - 1);     // return length of LPS    return maxLength;} // Driver Codepublic static void main(String[] args){    String str = "forgeeksskeegfor";    System.out.print("\nLength is: "         + longestPalSubstr(str));}} // This code is contributed by shikhasingrajput
# A Python3 solution for longest palindrome # Function to pra subString str[low..high]def printSubStr(str, low, high):         for i in range(low, high + 1):        print(str[i], end = "") # This function prints the# longest palindrome subString# It also returns the length# of the longest palindromedef longestPalSubstr(str):         # Get length of input String    n = len(str)         # All subStrings of length 1    # are palindromes    maxLength = 1    start = 0         # Nested loop to mark start    # and end index    for i in range(n):        for j in range(i, n):            flag = 1                         # Check palindrome            for k in range(0, ((j - i) // 2) + 1):                if (str[i + k] != str[j - k]):                    flag = 0             # Palindrome            if (flag != 0 and (j - i + 1) > maxLength):                start = i                maxLength = j - i + 1                     print("Longest palindrome subString is: ", end = "")    printSubStr(str, start, start + maxLength - 1)     # Return length of LPS    return maxLength # Driver Codeif __name__ == '__main__':     str = "forgeeksskeegfor"         print("\nLength is: ", longestPalSubstr(str)) # This code is contributed by 29AjayKumar
// A C# solution for longest palindromeusing System; class GFG{ // Function to print a subString str[low..high]static void printSubStr(String str, int low, int high){    for (int i = low; i <= high; ++i)        Console.Write(str[i]);} // This function prints the// longest palindrome subString// It also returns the length// of the longest palindromestatic int longestPalSubstr(String str){    // get length of input String    int n = str.Length;     // All subStrings of length 1    // are palindromes    int maxLength = 1, start = 0;     // Nested loop to mark start and end index    for (int i = 0; i < str.Length; i++) {        for (int j = i; j < str.Length; j++) {            int flag = 1;             // Check palindrome            for (int k = 0; k < (j - i + 1) / 2; k++)                if (str[i + k] != str[j - k])                    flag = 0;             // Palindrome            if (flag!=0 && (j - i + 1) > maxLength) {                start = i;                maxLength = j - i + 1;            }        }    }     Console.Write("longest palindrome subString is: ");    printSubStr(str, start, start + maxLength - 1);     // return length of LPS    return maxLength;} // Driver Codepublic static void Main(String[] args){    String str = "forgeeksskeegfor";    Console.Write("\nLength is: "         + longestPalSubstr(str));}} // This code is contributed by shikhasingrajput
<script>// A Javascript solution for longest palindrome // Function to print a subString str[low..high]function printSubStr(str,low,high){    for (let i = low; i <= high; ++i)        document.write(str[i]);} // This function prints the// longest palindrome subString// It also returns the length// of the longest palindromefunction longestPalSubstr(str){    // get length of input String    let n = str.length;      // All subStrings of length 1    // are palindromes    let maxLength = 1, start = 0;      // Nested loop to mark start and end index    for (let i = 0; i < str.length; i++) {        for (let j = i; j < str.length; j++) {            let flag = 1;              // Check palindrome            for (let k = 0; k < (j - i + 1) / 2; k++)                if (str[i + k] != str[j - k])                    flag = 0;              // Palindrome            if (flag!=0 && (j - i + 1) > maxLength) {                start = i;                maxLength = j - i + 1;            }        }    }      document.write("Longest palindrome subString is: ");    printSubStr(str, start, start + maxLength - 1);      // return length of LPS    return maxLength;} // Driver Codelet str = "forgeeksskeegfor";document.write("<br>Length is: "         + longestPalSubstr(str)); // This code is contributed by rag2127</script>
Longest palindrome substring is: geeksskeeg
Length is: 10
Complexity Analysis: 
Chapters
descriptions off, selected
captions settings, opens captions settings dialog
captions off, selected
English
This is a modal window.
Beginning of dialog window. Escape will cancel and close the window.
End of dialog window.
Time complexity: O(n^3). Three nested loops are needed to find the longest palindromic substring in this approach, so the time complexity is O(n^3).
Auxiliary complexity: O(1). As no extra space is needed.
Method 2: Dynamic Programming. Approach: The time complexity can be reduced by storing results of sub-problems. The idea is similar to this post.  
Maintain a boolean table[n][n] that is filled in bottom up manner.The value of table[i][j] is true, if the substring is palindrome, otherwise false.To calculate table[i][j], check the value of table[i+1][j-1], if the value is true and str[i] is same as str[j], then we make table[i][j] true.Otherwise, the value of table[i][j] is made false.We have to fill table previously for substring of length = 1 and length =2 because as we are finding , if table[i+1][j-1] is true or false , so in case of (i) length == 1 , lets say i=2 , j=2 and i+1,j-1 doesn’t lies between [i , j] (ii) length == 2 ,lets say i=2 , j=3 and i+1,j-1 again doesn’t lies between [i , j].
Maintain a boolean table[n][n] that is filled in bottom up manner.
The value of table[i][j] is true, if the substring is palindrome, otherwise false.
To calculate table[i][j], check the value of table[i+1][j-1], if the value is true and str[i] is same as str[j], then we make table[i][j] true.
Otherwise, the value of table[i][j] is made false.
We have to fill table previously for substring of length = 1 and length =2 because as we are finding , if table[i+1][j-1] is true or false , so in case of (i) length == 1 , lets say i=2 , j=2 and i+1,j-1 doesn’t lies between [i , j] (ii) length == 2 ,lets say i=2 , j=3 and i+1,j-1 again doesn’t lies between [i , j].
Below is the implementation of the above approach: 
C++
Java
Python
C#
Javascript
// A C++ dynamic programming// solution for longest palindrome #include <bits/stdc++.h>using namespace std; // Function to print a substring// str[low..high]void printSubStr(    string str, int low, int high){    for (int i = low; i <= high; ++i)        cout << str[i];} // This function prints the// longest palindrome substring// It also returns the length of// the longest palindromeint longestPalSubstr(string str){    // get length of input string    int n = str.size();     // table[i][j] will be false if substring    // str[i..j] is not palindrome.    // Else table[i][j] will be true    bool table[n][n];     memset(table, 0, sizeof(table));     // All substrings of length 1    // are palindromes    int maxLength = 1;     for (int i = 0; i < n; ++i)        table[i][i] = true;     // check for sub-string of length 2.    int start = 0;    for (int i = 0; i < n - 1; ++i) {        if (str[i] == str[i + 1]) {            table[i][i + 1] = true;            start = i;            maxLength = 2;        }    }     // Check for lengths greater than 2.    // k is length of substring    for (int k = 3; k <= n; ++k) {        // Fix the starting index        for (int i = 0; i < n - k + 1; ++i) {            // Get the ending index of substring from            // starting index i and length k            int j = i + k - 1;             // checking for sub-string from ith index to            // jth index iff str[i+1] to str[j-1] is a            // palindrome            if (table[i + 1][j - 1] && str[i] == str[j]) {                table[i][j] = true;                 if (k > maxLength) {                    start = i;                    maxLength = k;                }            }        }    }     cout << "Longest palindrome substring is: ";    printSubStr(str, start, start + maxLength - 1);     // return length of LPS    return maxLength;} // Driver Codeint main(){    string str = "forgeeksskeegfor";    cout << "\nLength is: "         << longestPalSubstr(str);    return 0;}
// Java Solutionpublic class LongestPalinSubstring {    // A utility function to print    // a substring str[low..high]    static void printSubStr(        String str, int low, int high)    {        System.out.println(            str.substring(                low, high + 1));    }     // This function prints the longest    // palindrome substring of str[].    // It also returns the length of the    // longest palindrome    static int longestPalSubstr(String str)    {        // get length of input string        int n = str.length();         // table[i][j] will be false if        // substring str[i..j] is not palindrome.        // Else table[i][j] will be true        boolean table[][] = new boolean[n][n];         // All substrings of length 1 are palindromes        int maxLength = 1;        for (int i = 0; i < n; ++i)            table[i][i] = true;         // check for sub-string of length 2.        int start = 0;        for (int i = 0; i < n - 1; ++i) {            if (str.charAt(i) == str.charAt(i + 1)) {                table[i][i + 1] = true;                start = i;                maxLength = 2;            }        }         // Check for lengths greater than 2.        // k is length of substring        for (int k = 3; k <= n; ++k) {             // Fix the starting index            for (int i = 0; i < n - k + 1; ++i) {                // Get the ending index of substring from                // starting index i and length k                int j = i + k - 1;                 // checking for sub-string from ith index to                // jth index iff str.charAt(i+1) to                // str.charAt(j-1) is a palindrome                if (table[i + 1][j - 1]                    && str.charAt(i) == str.charAt(j)) {                    table[i][j] = true;                     if (k > maxLength) {                        start = i;                        maxLength = k;                    }                }            }        }        System.out.print("Longest palindrome substring is; ");        printSubStr(str, start,                    start + maxLength - 1);         // return length of LPS        return maxLength;    }     // Driver program to test above functions    public static void main(String[] args)    {         String str = "forgeeksskeegfor";        System.out.println("Length is: " + longestPalSubstr(str));    }} // This code is contributed by Sumit Ghosh
# Python program import sys # A utility function to print a# substring str[low..high]def printSubStr(st, low, high) :    sys.stdout.write(st[low : high + 1])    sys.stdout.flush()    return '' # This function prints the longest palindrome# substring of st[]. It also returns the length# of the longest palindromedef longestPalSubstr(st) :    n = len(st) # get length of input string     # table[i][j] will be false if substring    # str[i..j] is not palindrome. Else    # table[i][j] will be true    table = [[0 for x in range(n)] for y                          in range(n)]         # All substrings of length 1 are    # palindromes    maxLength = 1    i = 0    while (i < n) :        table[i][i] = True        i = i + 1         # check for sub-string of length 2.    start = 0    i = 0    while i < n - 1 :        if (st[i] == st[i + 1]) :            table[i][i + 1] = True            start = i            maxLength = 2        i = i + 1         # Check for lengths greater than 2.    # k is length of substring    k = 3    while k <= n :        # Fix the starting index        i = 0        while i < (n - k + 1) :                         # Get the ending index of            # substring from starting            # index i and length k            j = i + k - 1                 # checking for sub-string from            # ith index to jth index iff            # st[i + 1] to st[(j-1)] is a            # palindrome            if (table[i + 1][j - 1] and                      st[i] == st[j]) :                table[i][j] = True                     if (k > maxLength) :                    start = i                    maxLength = k            i = i + 1        k = k + 1    print "Longest palindrome substring is: ", printSubStr(st, start,                                               start + maxLength - 1)     return maxLength # return length of LPS  # Driver program to test above functionsst = "forgeeksskeegfor"l = longestPalSubstr(st)print "Length is:", l # This code is contributed by Nikita Tiwari.
// C# Solutionusing System; class GFG {     // A utility function to print a    // substring str[low...( high - (low+1))]    static void printSubStr(string str, int low,                            int high)    {        Console.WriteLine(str.Substring(low,                                        high - low + 1));    }     // This function prints the longest    // palindrome substring of str[].    // It also returns the length of the    // longest palindrome    static int longestPalSubstr(string str)    {         // Get length of input string        int n = str.Length;         // Table[i, j] will be false if substring        // str[i..j] is not palindrome. Else        // table[i, j] will be true        bool[, ] table = new bool[n, n];         // All substrings of length 1 are palindromes        int maxLength = 1;        for (int i = 0; i < n; ++i)            table[i, i] = true;         // Check for sub-string of length 2.        int start = 0;         for (int i = 0; i < n - 1; ++i) {            if (str[i] == str[i + 1]) {                table[i, i + 1] = true;                start = i;                maxLength = 2;            }        }         // Check for lengths greater than 2.        // k is length of substring        for (int k = 3; k <= n; ++k) {             // Fix the starting index            for (int i = 0; i < n - k + 1; ++i) {                 // Get the ending index of substring from                // starting index i and length k                int j = i + k - 1;                 // Checking for sub-string from ith index                // to jth index iff str.charAt(i+1) to                // str.charAt(j-1) is a palindrome                if (table[i + 1, j - 1] && str[i] == str[j]) {                    table[i, j] = true;                    if (k > maxLength) {                        start = i;                        maxLength = k;                    }                }            }        }        Console.Write("Longest palindrome substring is: ");        printSubStr(str, start, start + maxLength - 1);         // Return length of LPS        return maxLength;    }     // Driver code    public static void Main(string[] args)    {        string str = "forgeeksskeegfor";         Console.WriteLine("Length is: " + longestPalSubstr(str));    }} // This code is contributed by SoumikMondal
<script>// Javascript Solution         // A utility function to print    // a substring str[low..high]   function printSubStr(str,low,high)   {           document.write(            str.substring(                low, high + 1)+"<br>");   }       // This function prints the longest    // palindrome substring of str[].    // It also returns the length of the    // longest palindrome   function longestPalSubstr(str)   {               // get length of input string        let n = str.length;          // table[i][j] will be false if        // substring str[i..j] is not palindrome.        // Else table[i][j] will be true        let table = new Array(n);        for(let i = 0; i < n; i++)        {            table[i] = new Array(n);        }          // All substrings of length 1 are palindromes        let maxLength = 1;        for (let i = 0; i < n; ++i)            table[i][i] = true;          // check for sub-string of length 2.        let start = 0;        for (let i = 0; i < n - 1; ++i)        {            if (str[i] == str[i + 1])            {                table[i][i + 1] = true;                start = i;                maxLength = 2;            }        }          // Check for lengths greater than 2.        // k is length of substring        for (let k = 3; k <= n; ++k) {              // Fix the starting index            for (let i = 0; i < n - k + 1; ++i)            {                             // Get the ending index of substring from                // starting index i and length k                let j = i + k - 1;                  // checking for sub-string from ith index to                // jth index iff str.charAt(i+1) to                // str.charAt(j-1) is a palindrome                if (table[i + 1][j - 1]                    && str[i] == str[j]) {                    table[i][j] = true;                      if (k > maxLength) {                        start = i;                        maxLength = k;                    }                }            }        }        document.write("Longest palindrome substring is; ");        printSubStr(str, start,                    start + maxLength - 1);          // return length of LPS        return maxLength;   }       // Driver program to test above functions   let str = "forgeeksskeegfor";   document.write("Length is: " + longestPalSubstr(str)); // This code is contributed by avanitrachhadiya2155</script>
Longest palindrome substring is: geeksskeeg
Length is: 10
Complexity Analysis:  
Time complexity: O(n^2). Two nested traversals are needed.
Auxiliary Space: O(n^2). Matrix of size n*n is needed to store the dp array.
nitin mittal
SoumikMondal
andrew1234
pradyumanagarwal
shikhasingrajput
29AjayKumar
rag2127
avanitrachhadiya2155
rishi2024csit1073
sumit21vpbe
harendrakumar123
Accolite
Amazon
Groupon
MakeMyTrip
Microsoft
Qualcomm
Samsung
Visa
Zoho
Dynamic Programming
Strings
Zoho
Accolite
Amazon
Microsoft
Samsung
MakeMyTrip
Visa
Qualcomm
Groupon
Strings
Dynamic Programming
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.