# Longest Palindromic Substring

Dynamic ProgrammingData StructureAlgorithms

In a given string, we have to find a substring, which is a palindrome and it is longest.

To get the longest palindromic substring, we have to solve many subproblems, some of the subproblems are overlapping. They are needed to be solved for multiple times. For that reason, the Dynamic programming is helpful. Using a table, we can store the result of the previous subproblems, and simply use them to generate further results.

## Input and Output

Input:
A String. Say “thisispalapsiti”
Output:
The palindrome substring and the length of the palindrome.
Longest palindrome substring is: ispalapsi
Length is: 9

## Algorithm

findLongPalSubstr(str)

Input − The main string.

Output − Longest palindromic substring and its length.

Begin
n := length of the given string
create a n x n table named palTab to store true or false value
fill patTab with false values
maxLen := 1

for i := 0 to n-1, do
patTab[i, i] = true       //as it is palindrome of length 1
done

start := 0
for i := 0 to n-2, do
if str[i] = str[i-1], then
palTab[i, i+1] := true
start := i
maxLen := 2
done

for k := 3 to n, do
for i := 0 to n-k, do
j := i + k – 1
if palTab[i+1, j-1] and str[i] = str[j], then
palTab[i, j] := true
if k > maxLen, then
start := i
maxLen := k
done
done
display substring from start to maxLen from str, and return maxLen
End

## Example

#include<iostream>
using namespace std;

int findLongPalSubstr(string str) {
int n = str.size();        // get length of input string

bool palCheckTab[n][n];    //true when substring from i to j is palindrome

for(int i = 0; i<n; i++)
for(int j = 0; j<n; j++)
palCheckTab[i][j] = false;      //initially set all values to false

int maxLength = 1;

for (int i = 0; i < n; ++i)
palCheckTab[i][i] = true;       //as all substring of length 1 is palindrome

int start = 0;
for (int i = 0; i < n-1; ++i) {
if (str[i] == str[i+1]) {      //for two character substring both characters are equal
palCheckTab[i][i+1] = true;
start = i;
maxLength = 2;
}
}

for (int k = 3; k <= n; ++k) {       //for substrings with length 3 to n
for (int i = 0; i < n-k+1 ; ++i) {
int j = i + k - 1;
if (palCheckTab[i+1][j-1] && str[i] == str[j]) {    //if (i,j) and (i+1, j-1) are same, then check palindrome
palCheckTab[i][j] = true;
if (k > maxLength) {
start = i;
maxLength = k;
}
}
}
}
cout << "Longest palindrome substring is: " << str.substr(start, maxLength) << endl;
return maxLength; // return length
}

int main() {
char str[] = "thisispalapsiti";
cout << "Length is: "<< findLongPalSubstr(str);
}

## Output

Longest palindrome substring is: ispalapsi
Length is: 9