Home Strings Longest Palindromic Substring

Longest Palindromic Substring

by nikoo28
2 comments 4 minutes read

Let us suppose that we are given a string ‘str’. You need to find out the longest palindrome as a substring. Note that the elements of the string should be contagious.

Example 1:
Input: "aaebabad"
Output: "bab"
Note: "aba" is also a valid answer

Example 2:
Input: "cbeereed"
Output: "eeree"

Terminology:

Palindrome: A palindrome is a type of string that reads the same when reading left to right and right to left. An example of a palindrome can be “level”, “racecar”, “kayak” etc.

Sub-string: A string formed formed using the characters of the string that may or may not contain repetitions.

Brute Force Method:

As soon as you see the problem, the most first thought that comes to your mind would be to find all the sub-strings from the given string and keep a track of the longest one that we find. That will eventually land you to the right answer, but the time complexity of such an algorithm would be enormous. There total number of sub-strings would be =\frac{n\ *\ (n\ -\ 1)}{2}

This would cause the complexity to quickly reach O(n^2) and we can check if a string is a palindrome in O(n) time, resulting in a total complexity of O(n^3). This is something we do not want as it will take up a lot of time.

Optimized Method:

Let us try to aim for a method with a complexity of )(n^2). The algorithm will look something like:

  • Start traversing the string from the first character to the last character.
  • For each of the position ‘i’ in the string, find out the largest palindrome having an even length and an odd length. Note that a single letter can also be a palindrome.
  • The minimum valid even length would be 2. Eg: “aa”, “cc”, xx”.
  • The minimum valid odd length would be 1. Eg: “a”, “v”.
  • Hence for each of the character in the string, navigate in both left and right directions till the condition for palindrome is satisfied.
  • Keep a track of the largest palindrome encountered so far.
  • At the end of this loop, you would have the longest palindrome sub-string.
Code:
String longestPalindrome(String str) {

    if (str.length() <= 1)
      return str;

    String LPS = "";

    for (int i = 1; i < str.length(); i++) {

      // Consider odd length
      int low = i;
      int high = i;
      // Keep extending in both left and right directions till the
      // conditions for a palindrome are met
      while(str.charAt(low) == str.charAt(high)) {
        low--;
        high++;

        // Terminating condition if we reach the end/start of the string
        if (low == -1 || high == str.length())
          break;
      }

      // Indexes low and high can be used to extract the substring
      String palindrome = str.substring(low+1, high);
      if (palindrome.length() > LPS.length()) {
        // Capture the longest palindrome found
        LPS = palindrome;
      }

      // Consider even length
      low = i - 1;
      high = i;
      while(str.charAt(low) == str.charAt(high)) {
        low--;
        high++;

        if (low == -1 || high == str.length())
          break;
      }

      palindrome = str.substring(low+1, high);
      if (palindrome.length() > LPS.length()) {
        // Similarly, keep a track of the longest even length palindrome
        LPS = palindrome;
      }
    }

    return LPS;
  }
Code language: Java (java)

Time Complexity: O(n^2)
Space Complexity: O(n)

A working solution can be found here: https://ideone.com/GvH6g0
This code can also be obtained on Github.
A similar problem is available on Leetcode.
A similar question: length of longest palindrome that can be built from a string.

Video explanation:
YouTube player

You may also like

2 comments

Mohan Krishnan December 31, 2021 - 08:33

Excellent video and explanation , can you please help me understand why we start with low as i-1 for even set of characters .

courpedia May 20, 2021 - 06:16

Nice

Comments are closed.

This website uses cookies to improve your experience. We'll assume you're ok with this, but you can opt-out if you wish. Accept Read More