Longest Palindromic Substring | Set 2

30 Jun, 2022
Given a string, find the longest substring which is a palindrome. 
Examples: 
Input: Given string :"forgeeksskeegfor", 
Output: "geeksskeeg".

Input: Given string :"Geeks", 
Output: "ee". 
Common mistake : Wrong Approach:   
Some people will be tempted to come up with a O(n) time complexity quick solution, which is unfortunately flawed (however can be corrected easily):
 (i)Reverse S and  and store it in S’.  (ii)Find the longest common substring between S and S’  which must also be the longest palindromic substring.
This seemed to work, let’s see some examples below.
For example, S = “caba” then  S’ = “abac”.
The longest common substring between S and S’ is “aba”, which is the answer.
Let’s try another example: S = “abacdfgdcaba” then S’ = “abacdgfdcaba”.
The longest common substring between S and S’ is “abacd”. Clearly, this is not a valid palindrome.
Correct Approach:
We could see that the longest common substring method fails when there exists a reversed copy of a non-palindromic substring in some other part of S. To rectify this, each time we find a longest common substring candidate, we check if the substring’s indices are the same as the reversed substring’s original indices. If it is, then we attempt to update the longest palindrome found so far; if not, we skip this and find the next candidate. This gives us an O(n^2) Dynamic Programming solution which uses O(n^2) space (which could be improved to use O(n) space).
Dyanamic programming Approach: Dynamic programming solution is already discussed here in the previous post. The time complexity of the Dynamic Programming based solution is O(n^2) and it requires O(n^2) extra space. We can find the longest palindrome substring( LPS ) in (n^2) time with O(1) extra space. 
The algorithm below is very simple and easy to understand. The idea is to Fix a center and expand in both directions for longer palindromes and keep track of the longest palindrome seen so far.
ALGO:
Maintain a variable ‘ maxLength = 1 ‘ (for storing LPS length) and ‘ start =0 ‘ (for storing starting index of LPS ).The idea is very simple, we will traverse through the entire string with i=0 to i<(length of string).while traversing, initialize ‘low‘ and ‘high‘ pointer such that low= i-1 and high= i+1.keep incrementing ‘high’ until str[high]==str[i] .similarly keep decrementing ‘low’ until str[low]==str[i].finally we will keep incrementing ‘high’ and decrementing ‘low’ until str[low]==str[high].calculate length=high-low-1, if length > maxLength then maxLength = length and start = low+1 .Print the LPS and return maxLength. 
Maintain a variable ‘ maxLength = 1 ‘ (for storing LPS length) and ‘ start =0 ‘ (for storing starting index of LPS ).
The idea is very simple, we will traverse through the entire string with i=0 to i<(length of string).while traversing, initialize ‘low‘ and ‘high‘ pointer such that low= i-1 and high= i+1.keep incrementing ‘high’ until str[high]==str[i] .similarly keep decrementing ‘low’ until str[low]==str[i].finally we will keep incrementing ‘high’ and decrementing ‘low’ until str[low]==str[high].calculate length=high-low-1, if length > maxLength then maxLength = length and start = low+1 .
while traversing, initialize ‘low‘ and ‘high‘ pointer such that low= i-1 and high= i+1.keep incrementing ‘high’ until str[high]==str[i] .similarly keep decrementing ‘low’ until str[low]==str[i].finally we will keep incrementing ‘high’ and decrementing ‘low’ until str[low]==str[high].calculate length=high-low-1, if length > maxLength then maxLength = length and start = low+1 .
while traversing, initialize ‘low‘ and ‘high‘ pointer such that low= i-1 and high= i+1.
keep incrementing ‘high’ until str[high]==str[i] .
similarly keep decrementing ‘low’ until str[low]==str[i].
finally we will keep incrementing ‘high’ and decrementing ‘low’ until str[low]==str[high].
calculate length=high-low-1, if length > maxLength then maxLength = length and start = low+1 .
Print the LPS and return maxLength. 
C++
C
Java
Python3
C#
Javascript
// A O(n^2) time and O(1) space program to// find the longest palindromic substring// easy to understand as compared to previous version.#include <bits/stdc++.h>using namespace std; // A utility function to print// a substring str[low..high]// This function prints the// longest palindrome substring (LPS)// of str[]. It also returns the// length of the longest palindromeint longestPalSubstr(string str){    int n = str.size(); // calculating size of string    if (n < 2)        return n; // if string is empty then size will be 0.                  // if n==1 then, answer will be 1(single                  // character will always palindrome)     int maxLength = 1, start = 0;    int low, high;    for (int i = 0; i < n; i++) {        low = i - 1;        high = i + 1;        while (high < n               && str[high] == str[i]) // increment 'high'            high++;         while (low >= 0               && str[low] == str[i]) // decrement 'low'            low--;         while (low >= 0 && high < n               && str[low] == str[high]) {            low--;            high++;        }         int length = high - low - 1;        if (maxLength < length) {            maxLength = length;            start = low + 1;        }    }     cout << "Longest palindrome substring is: ";    cout << str.substr(start, maxLength);    return maxLength;} // Driver program to test above functionsint main(){    string str = "forgeeksskeegfor";    cout << "\nLength is: " << longestPalSubstr(str)         << endl;    return 0;}
// A O(n^2) time and O(1) space// program to find the longest// palindromic substring#include <stdio.h>#include <string.h> // A utility function to print// a substring str[low..high]void printSubStr(char* str, int low, int high){    for (int i = low; i <= high; ++i)        printf("%c", str[i]);} // This function prints the longest// palindrome substring (LPS)// of str[]. It also returns the// length of the longest palindromeint longestPalSubstr(char* str){    int n = strlen(str); // calculating size of string    if (n < 2)        return n; // if string is empty then size will be 0.                  // if n==1 then, answer will be 1(single                  // character will always palindrome)     int maxLength = 1, start = 0;    int low, high;    for (int i = 0; i < n; i++) {        low = i - 1;        high = i + 1;        while (high < n               && str[high] == str[i]) // increment 'high'            high++;         while (low >= 0               && str[low] == str[i]) // decrement 'low'            low--;         while (low >= 0 && high < n               && str[low] == str[high]) {            low--; // decrement low            high++; // increment high        }         int length = high - low - 1;        if (maxLength < length) {            maxLength = length;            start = low + 1;        }    }    printf("Longest palindrome substring is: ");    printSubStr(str, start, start + maxLength - 1);    return maxLength;} // Driver program to test above functionsint main(){    char str[] = "forgeeksskeegfor";    printf("\nLength is: %d", longestPalSubstr(str));    return 0;}
// Java implementation of O(n^2)// time and O(1) space method// to find the longest palindromic substringpublic class LongestPalinSubstring {       // This function prints the    // longest palindrome substring    // (LPS) of str[]. It also    // returns the length of the    // longest palindrome    static int longestPalSubstr(String str)    {        int n = str.length(); // calculcharAting size of string        if (n < 2)            return n; // if string is empty then size will be 0.                  // if n==1 then, answer will be 1(single                  // character will always palindrome)         int maxLength = 1,start=0;        int low, high;        for (int i = 0; i < n; i++) {            low = i - 1;            high = i + 1;            while ( high < n && str.charAt(high) == str.charAt(i)) //increment 'high'                                                  high++;                   while ( low >= 0 && str.charAt(low) == str.charAt(i)) // decrement 'low'                                   low--;                   while (low >= 0 && high < n && str.charAt(low) == str.charAt(high) ){                  low--;                high++;        }         int length = high - low - 1;        if (maxLength < length){            maxLength = length;            start=low+1;        }    }       System.out.print("Longest palindrome substring is: ");    System.out.println(str.substring(start, start + maxLength ));    return maxLength;        }     // Driver program to test above function    public static void main(String[] args)    {         String str = "forgeeksskeegfor";        System.out.println("Length is: "                           + longestPalSubstr(str));    }}
# A O(n ^ 2) time and O(1) space program to find the# longest palindromic substring # This function prints the longest palindrome substring (LPS)# of str[]. It also returns the length of the longest palindrome  def longestPalSubstr(string):    n = len(string) # calculating size of string    if (n < 2):        return n # if string is empty then size will be 0.                  # if n==1 then, answer will be 1(single                  # character will always palindrome)    start=0    maxLength = 1    for i in range(n):        low = i - 1        high = i + 1        while (high < n and string[high] == string[i] ):                                          high=high+1               while (low >= 0 and string[low] == string[i] ):                            low=low-1               while (low >= 0 and high < n and string[low] == string[high] ):          low=low-1          high=high+1                      length = high - low - 1        if (maxLength < length):            maxLength = length            start=low+1                 print ("Longest palindrome substring is:",end=" ")    print (string[start:start + maxLength])         return maxLength     # Driver program to test above functionsstring = ("forgeeksskeegfor")print("Length is: " + str(longestPalSubstr(string)))
// C# implementation of O(n^2) time// and O(1) space method to find the// longest palindromic substringusing System; class GFG {     // This function prints the longest    // palindrome substring (LPS) of str[].    // It also returns the length of the    // longest palindrome    public static int longestPalSubstr(string str)    {        int n = str.Length; // calculcharAting size of string        if (n < 2)            return n; // if string is empty then size will be 0.                  // if n==1 then, answer will be 1(single                  // character will always palindrome)         int maxLength = 1,start=0;        int low, high;        for (int i = 0; i < n; i++) {            low = i - 1;            high = i + 1;            while ( high < n && str[high] == str[i] ) //increment 'high'                                                  high++;                   while ( low >= 0 && str[low] == str[i]) // decrement 'low'                                   low--;                   while (low >= 0 && high < n && str[low] == str[high] ){                  low--;                high++;        }         int length = high - low - 1;        if (maxLength < length){            maxLength = length;            start=low+1;        }    }       Console.Write("Longest palindrome substring is: ");    Console.WriteLine(str.Substring(start, maxLength));    return maxLength;    }     // Driver Code    public static void Main(string[] args)    {        string str = "forgeeksskeegfor";        Console.WriteLine("Length is: "                          + longestPalSubstr(str));    }}
<script> // A O(n^2) time and O(1) space program to// find the longest palindromic substring// easy to understand as compared to previous version. // A utility function to print// a substring str[low..high]// This function prints the// longest palindrome substring (LPS)// of str[]. It also returns the// length of the longest palindromefunction longestPalSubstr(str){    let n = str.length; // calculating size of string    if (n < 2)        return n; // if string is empty then size will be 0.                // if n==1 then, answer will be 1(single                // character will always palindrome)     let maxLength = 1,start=0;    let low, high;    for (let i = 0; i < n; i++) {        low = i - 1;        high = i + 1;        while ( high < n && str[high] == str[i]) //increment 'high'                                           high++;             while ( low >= 0 && str[low] == str[i]) // decrement 'low'                           low--;             while (low >= 0 && high < n && str[low] == str[high]){            low--;            high++;        }         let length = high - low - 1;        if (maxLength < length) {            maxLength = length;            start=low+1;        }    }         document.write("Longest palindrome substring is: ");    document.write(str.substring(start,maxLength+start));    return maxLength;} // Driver program to test above functions let str = "forgeeksskeegfor";document.write("</br>","Length is: " + longestPalSubstr(str),"</br>");  </script>
Longest palindrome substring is: geeksskeeg
Length is: 10

Complexity Analysis:  
Time complexity: O(n^2), where n is the length of the input string. Outer Loop that traverses through the entire string, and Inner Loop that is used to expand from i .
Auxiliary Space: O(1). No extra space is needed.
The Above approach is a cleaner way.
The function implementation to print the LPS and return the maxLength is given below:
C++
Java
C#
// A O(n^2) time and O(1) space program to// find the longest palindromic substring// easy to understand as compared to previous version. #include <bits/stdc++.h>using namespace std; int maxLength; // variables to store andstring res; // update  maxLength and res // A utility function to get the longest palindrome// starting and expanding out from given center indicesvoid cSubUtil(string& s, int l, int r){    // check if the indices lie in the range of string    // and also if it is palindrome    while (l >= 0 && r < s.length() && s[l] == s[r]) {        // expand the boundary        l--;        r++;    }    // if it's length is greater than maxLength update    // maxLength and res    if (r - l - 1 >= maxLength) {        res = s.substr(l + 1, r - l - 1);        maxLength = r - l - 1;    }    return;}// A function which takes a string prints the LPS and// returns the length of LPSint longestPalSubstr(string str){    res = "";    maxLength = 1;    // for every index in the string check palindromes    // starting from that index    for (int i = 0; i < str.length(); i++) {        // check for odd length palindromes        cSubUtil(str, i, i);        // check for even length palindromes        cSubUtil(str, i, i + 1);    }     cout << "Longest palindrome substring is: ";    cout << res << "\n";     return maxLength;} // Driver program to test above functionsint main(){    string str = "forgeeksskeegfor";    cout << "\nLength is: " << longestPalSubstr(str)         << endl;    return 0;}
// Java implementation of O(n^2)// time and O(1) space method// to find the longest palindromic substring public class LongestPalinSubstring {     static int maxLength; // variables to store and    static String res; // update  maxLength and res     // A utility function to get the longest palindrome    // starting and expanding out from given center indices    static void cSubUtil(String s, int l, int r)    {        // check if the indices lie in the range of string        // and also if it is palindrome        while (l >= 0 && r < s.length()               && s.charAt(l) == s.charAt(r)) {            // expand the boundary            l--;            r++;        }        // if it's length is greater than maxLength update        // maxLength and res        if (r - l - 1 >= maxLength) {            res = s.substring(l + 1, r);            maxLength = r - l - 1;        }        return;    }    // A function which takes a string prints the LPS and    // returns the length of LPS    static int longestPalSubstr(String str)    {        res = "";        maxLength = 1;        // for every index in the string check palindromes        // starting from that index        for (int i = 0; i < str.length(); i++) {            // check for odd length palindromes            cSubUtil(str, i, i);            // check for even length palindromes            cSubUtil(str, i, i + 1);        }        System.out.print(            "Longest palindrome substring is: ");        System.out.println(res);        return maxLength;    }     // Driver program to test above function    public static void main(String[] args)    {         String str = "forgeeksskeegfor";        System.out.println("Length is: "                           + longestPalSubstr(str));    }}
// C# implementation of O(n^2) time// and O(1) space method to find the// longest palindromic substringusing System; class GFG {     static int maxLength; // variables to store and    static string res; // update  maxLength and res     // A utility function to get the longest palindrome    // starting and expanding out from given center indices    public static void cSubUtil(string s, int l, int r)    {        // check if the indices lie in the range of string        // and also if it is palindrome        while (l >= 0 && r < s.Length && s[l] == s[r]) {            // expand the boundary            l--;            r++;        }        // if it's length is greater than maxLength update        // maxLength and res        if (r - l - 1 >= maxLength) {            res = s.Substring(l + 1, r - l - 1);            maxLength = r - l - 1;        }        return;    }    // A function which takes a string prints the LPS and    // returns the length of LPS    public static int longestPalSubstr(string str)    {        res = "";        maxLength = 1;        // for every index in the string check palindromes        // starting from that index        for (int i = 0; i < str.Length; i++) {            // check for odd length palindromes            cSubUtil(str, i, i);            // check for even length palindromes            cSubUtil(str, i, i + 1);        }         Console.Write("Longest palindrome substring is: ");        Console.WriteLine(res);        return maxLength;    }     // Driver Code    public static void Main(string[] args)    {        string str = "forgeeksskeegfor";        Console.WriteLine("Length is: "                          + longestPalSubstr(str));    }}
Longest palindrome substring is: geeksskeeg

Length is: 10

Please write comments if you find anything incorrect, or have more information about the topic discussed above.
shrikanth13
ukasp
rathbhupendra
andrew1234
sourabh1996
rag2127
RaviOstwal
yogesh vishwakarma
kk9826225
amartyaghoshgfg
oyesaurabh
shinjanpatra
20ec01033
abhijeet19403
Accolite
Amazon
Groupon
Microsoft
palindrome
Strings
Accolite
Amazon
Microsoft
Groupon
Strings
palindrome
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Check for Balanced Brackets in an expression (well-formedness) using Stack
Different Methods to Reverse a String in C++
Python program to check if a string is palindrome or not
KMP Algorithm for Pattern Searching
What is Data Structure: Types, Classifications and Applications
Top 50 String Coding Problems for Interviews
Length of the longest substring without repeating characters
Convert string to char array in C++
Reverse words in a given string
Check whether two strings are anagram of each other