# Print the longest palindromic prefix of a given string

Given a string str, the task is to find the longest palindromic prefix of the given string.

Examples:

Input: str = “abaac”
Output: aba
Explanation:
The longest prefix of the given string which is palindromic is “aba”.

Input: str = “abacabaxyz”
Output: abacaba
Explanation:
The prefixes of the given string which is palindromic are “aba” and “abacabaxyz”.
But the longest of among two is “abacabaxyz”.

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Naive Approach: The idea is to generate all the substring of the given string from the starting index and check whether the substrings are palindromic or not. The palindromic string with a maximum length is the resultant string.

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach ` `#include ` `using` `namespace` `std; ` ` `  `// Function to find the longest prefix ` `// which is palindromic ` `void` `LongestPalindromicPrefix(string s) ` `{ ` ` `  `    ``// Find the length of the given string ` `    ``int` `n = s.length(); ` ` `  `    ``// For storing the length of longest ` `    ``// prefix palindrome ` `    ``int` `max_len = 0; ` ` `  `    ``// Loop to check the substring of all ` `    ``// length from 1 to N which is palindrome ` `    ``for` `(``int` `len = 1; len <= n; len++) { ` ` `  `        ``// String of length i ` `        ``string temp = s.substr(0, len); ` ` `  `        ``// To store the reversed of temp ` `        ``string temp2 = temp; ` ` `  `        ``// Reversing string temp2 ` `        ``reverse(temp2.begin(), temp2.end()); ` ` `  `        ``// If string temp is palindromic ` `        ``// then update the length ` `        ``if` `(temp == temp2) { ` `            ``max_len = len; ` `        ``} ` `    ``} ` ` `  `    ``// Print the palindromic string of ` `    ``// max_len ` `    ``cout << s.substr(0, max_len); ` `} ` ` `  `// Driver Code ` `int` `main() ` `{ ` ` `  `    ``// Given string ` `    ``string str = ``"abaab"``; ` ` `  `    ``// Function Call ` `    ``LongestPalindromicPrefix(str); ` `} `

## Java

 `// Java program for the above approach ` `import` `java.util.*; ` `class` `GFG{ ` ` `  `// Function to find the longest prefix ` `// which is palindromic ` `static` `void` `LongestPalindromicPrefix(String s) ` `{ ` ` `  `    ``// Find the length of the given String ` `    ``int` `n = s.length(); ` ` `  `    ``// For storing the length of longest ` `    ``// prefix palindrome ` `    ``int` `max_len = ``0``; ` ` `  `    ``// Loop to check the subString of all ` `    ``// length from 1 to N which is palindrome ` `    ``for` `(``int` `len = ``1``; len <= n; len++) ` `    ``{ ` ` `  `        ``// String of length i ` `        ``String temp = s.substring(``0``, len); ` ` `  `        ``// To store the reversed of temp ` `        ``String temp2 = temp; ` ` `  `        ``// Reversing String temp2 ` `        ``temp2 = reverse(temp2); ` ` `  `        ``// If String temp is palindromic ` `        ``// then update the length ` `        ``if` `(temp.equals(temp2)) ` `        ``{ ` `            ``max_len = len; ` `        ``} ` `    ``} ` ` `  `    ``// Print the palindromic String of ` `    ``// max_len ` `    ``System.out.print(s.substring(``0``, max_len)); ` `} ` ` `  `static` `String reverse(String input)  ` `{ ` `    ``char``[] a = input.toCharArray(); ` `    ``int` `l, r = a.length - ``1``; ` `    ``for` `(l = ``0``; l < r; l++, r--)  ` `    ``{ ` `        ``char` `temp = a[l]; ` `        ``a[l] = a[r]; ` `        ``a[r] = temp; ` `    ``} ` `    ``return` `String.valueOf(a); ` `}  ` ` `  `// Driver Code ` `public` `static` `void` `main(String[] args) ` `{ ` ` `  `    ``// Given String ` `    ``String str = ``"abaab"``; ` ` `  `    ``// Function Call ` `    ``LongestPalindromicPrefix(str); ` `} ` `} ` ` `  `// This code is contributed by Rajput-Ji `

## Python3

 `# Python3 program for the above approach  ` ` `  `# Function to find the longest prefix ` `# which is palindrome ` `def` `LongestPalindromicPrefix(string): ` `     `  `    ``# Find the length of the given string ` `    ``n ``=` `len``(string) ` `     `  `    ``# For storing the length of longest  ` `    ``# Prefix Palindrome ` `    ``max_len ``=` `0` `     `  `    ``# Loop to check the substring of all  ` `    ``# length from 1 to n which is palindrome ` `    ``for` `length ``in` `range``(``0``, n ``+` `1``): ` `         `  `        ``# String of length i ` `        ``temp ``=` `string[``0``:length] ` `         `  `        ``# To store the value of temp ` `        ``temp2 ``=` `temp ` `         `  `        ``# Reversing the value of temp  ` `        ``temp3 ``=` `temp2[::``-``1``] ` `         `  `        ``# If string temp is palindromic  ` `        ``# then update the length ` `        ``if` `temp ``=``=` `temp3: ` `            ``max_len ``=` `length ` `     `  `    ``# Print the palindromic string  ` `    ``# of max_len ` `    ``print``(string[``0``:max_len]) ` ` `  `# Driver code ` `if` `__name__ ``=``=` `'__main__'` `: ` `     `  `    ``string ``=` `"abaac"``; ` `     `  `    ``# Function call ` `    ``LongestPalindromicPrefix(string) ` `     `  `# This code is contributed by virusbuddah_ `

## C#

 `// C# program for the above approach ` `using` `System; ` ` `  `class` `GFG{ ` ` `  `// Function to find the longest prefix ` `// which is palindromic ` `static` `void` `longestPalindromicPrefix(String s) ` `{ ` ` `  `    ``// Find the length of the given String ` `    ``int` `n = s.Length; ` ` `  `    ``// For storing the length of longest ` `    ``// prefix palindrome ` `    ``int` `max_len = 0; ` ` `  `    ``// Loop to check the subString of all ` `    ``// length from 1 to N which is palindrome ` `    ``for` `(``int` `len = 1; len <= n; len++) ` `    ``{ ` ` `  `        ``// String of length i ` `        ``String temp = s.Substring(0, len); ` ` `  `        ``// To store the reversed of temp ` `        ``String temp2 = temp; ` ` `  `        ``// Reversing String temp2 ` `        ``temp2 = reverse(temp2); ` ` `  `        ``// If String temp is palindromic ` `        ``// then update the length ` `        ``if` `(temp.Equals(temp2)) ` `        ``{ ` `            ``max_len = len; ` `        ``} ` `    ``} ` ` `  `    ``// Print the palindromic String of ` `    ``// max_len ` `    ``Console.Write(s.Substring(0, max_len)); ` `} ` ` `  `static` `String reverse(String input)  ` `{ ` `    ``char``[] a = input.ToCharArray(); ` `    ``int` `l, r = a.Length - 1; ` `    ``for` `(l = 0; l < r; l++, r--)  ` `    ``{ ` `        ``char` `temp = a[l]; ` `        ``a[l] = a[r]; ` `        ``a[r] = temp; ` `    ``} ` `    ``return` `String.Join(``""``,a); ` `}  ` ` `  `// Driver Code ` `public` `static` `void` `Main(String[] args) ` `{ ` ` `  `    ``// Given String ` `    ``String str = ``"abaab"``; ` ` `  `    ``// Function Call ` `    ``longestPalindromicPrefix(str); ` `} ` `} ` ` `  `// This code is contributed by amal kumar choubey `

Output:

```aba
```

Time Complexity: O(N2), where N is the length of the given string.

Efficient Approach: The idea is to use preprocessing algorithm KMP Algorithm. Below are the steps:

1. Create a temporary string(say str2) which is:
```str2 = str + '?' reverse(str);
```
2. Create an array(say lps[]) of size of length of the string str2 which will store the longest palindromic prefix which is also a suffix of string str2.
3. Update the lps[] by using preprocessing algorithm of KMP Search Algorithm.
4. lps[length(str2) – 1] will give the length of the longest palindromic prefix string of the given string str.

Below is the implementation of the above approach:

## C++

 `// C++ program for the above approach ` `#include ` `using` `namespace` `std; ` ` `  `// Function to find the longest prefix ` `// which is palindromic ` `void` `LongestPalindromicPrefix(string str) ` `{ ` ` `  `    ``// Create temporary string ` `    ``string temp = str + ``'?'``; ` ` `  `    ``// Reverse the string str ` `    ``reverse(str.begin(), str.end()); ` ` `  `    ``// Append string str to temp ` `    ``temp += str; ` ` `  `    ``// Find the length of string temp ` `    ``int` `n = temp.length(); ` ` `  `    ``// lps[] array for string temp ` `    ``int` `lps[n]; ` ` `  `    ``// Intialise every value with zero ` `    ``fill(lps, lps + n, 0); ` ` `  `    ``// Iterate the string temp ` `    ``for` `(``int` `i = 1; i <= n; i++) { ` ` `  `        ``// Length of longest prefix ` `        ``// till less than i ` `        ``int` `len = lps[i - 1]; ` ` `  `        ``// Calculate length for i+1 ` `        ``while` `(len > 0 ` `               ``&& temp[len] != temp[i]) { ` `            ``len = lps[len - 1]; ` `        ``} ` ` `  `        ``// If character at current index ` `        ``// len are same then increament ` `        ``// length by 1 ` `        ``if` `(temp[i] == temp[len]) { ` `            ``len++; ` `        ``} ` ` `  `        ``// Update the length at current ` `        ``// index to len ` `        ``lps[i] = len; ` `    ``} ` ` `  `    ``// Print the palindromic string of ` `    ``// max_len ` `    ``cout << temp.substr(0, lps[n - 1]); ` `} ` ` `  `// Driver's Code ` `int` `main() ` `{ ` ` `  `    ``// Given string ` `    ``string str = ``"abaab"``; ` ` `  `    ``// Function Call ` `    ``LongestPalindromicPrefix(str); ` `} `

## Java

 `// Java program for the above approach ` `import` `java.util.*; ` ` `  `class` `GFG{ ` ` `  `// Function to find the longest  ` `// prefix which is palindromic ` `static` `void` `LongestPalindromicPrefix(String str) ` `{ ` ` `  `    ``// Create temporary String ` `    ``String temp = str + ``'?'``; ` ` `  `    ``// Reverse the String str ` `    ``str = reverse(str); ` ` `  `    ``// Append String str to temp ` `    ``temp += str; ` ` `  `    ``// Find the length of String temp ` `    ``int` `n = temp.length(); ` ` `  `    ``// lps[] array for String temp ` `    ``int` `[]lps = ``new` `int``[n]; ` ` `  `    ``// Intialise every value with zero ` `    ``Arrays.fill(lps, ``0``); ` ` `  `    ``// Iterate the String temp ` `    ``for``(``int` `i = ``1``; i < n; i++) ` `    ``{ ` `         `  `       ``// Length of longest prefix ` `       ``// till less than i ` `       ``int` `len = lps[i - ``1``]; ` `        `  `       ``// Calculate length for i+1 ` `       ``while` `(len > ``0` `&& temp.charAt(len) !=  ` `                         ``temp.charAt(i))  ` `       ``{ ` `           ``len = lps[len - ``1``]; ` `       ``} ` `        `  `       ``// If character at current index ` `       ``// len are same then increament ` `       ``// length by 1 ` `       ``if` `(temp.charAt(i) == temp.charAt(len)) ` `       ``{ ` `           ``len++; ` `       ``} ` `        `  `       ``// Update the length at current ` `       ``// index to len ` `       ``lps[i] = len; ` `    ``} ` ` `  `    ``// Print the palindromic String  ` `    ``// of max_len ` `    ``System.out.print(temp.substring(``0``, lps[n - ``1``])); ` `} ` ` `  `static` `String reverse(String input) ` `{ ` `    ``char``[] a = input.toCharArray(); ` `    ``int` `l, r = a.length - ``1``; ` `     `  `    ``for``(l = ``0``; l < r; l++, r--) ` `    ``{ ` `       ``char` `temp = a[l]; ` `       ``a[l] = a[r]; ` `       ``a[r] = temp; ` `    ``} ` `    ``return` `String.valueOf(a); ` `} ` ` `  `// Driver Code ` `public` `static` `void` `main(String[] args) ` `{ ` ` `  `    ``// Given String ` `    ``String str = ``"abaab"``; ` ` `  `    ``// Function Call ` `    ``LongestPalindromicPrefix(str); ` `} ` `} ` ` `  `// This code is contributed by Rajput-Ji `

## C#

 `// C# program for the above approach ` `using` `System; ` ` `  `class` `GFG{ ` ` `  `// Function to find the longest  ` `// prefix which is palindromic ` `static` `void` `longestPalindromicPrefix(String str) ` `{ ` `     `  `    ``// Create temporary String ` `    ``String temp = str + ``'?'``; ` ` `  `    ``// Reverse the String str ` `    ``str = reverse(str); ` ` `  `    ``// Append String str to temp ` `    ``temp += str; ` ` `  `    ``// Find the length of String temp ` `    ``int` `n = temp.Length; ` ` `  `    ``// lps[] array for String temp ` `    ``int` `[]lps = ``new` `int``[n]; ` ` `  `    ``// Iterate the String temp ` `    ``for``(``int` `i = 1; i < n; i++) ` `    ``{ ` `        `  `       ``// Length of longest prefix ` `       ``// till less than i ` `       ``int` `len = lps[i - 1]; ` `        `  `       ``// Calculate length for i+1 ` `       ``while` `(len > 0 && temp[len] != temp[i])  ` `       ``{ ` `           ``len = lps[len - 1]; ` `       ``} ` `        `  `       ``// If character at current index ` `       ``// len are same then increament ` `       ``// length by 1 ` `       ``if` `(temp[i] == temp[len]) ` `       ``{ ` `           ``len++; ` `       ``} ` `        `  `       ``// Update the length at current ` `       ``// index to len ` `       ``lps[i] = len; ` `    ``} ` `     `  `    ``// Print the palindromic String  ` `    ``// of max_len ` `    ``Console.Write(temp.Substring(0, lps[n - 1])); ` `} ` ` `  `static` `String reverse(String input) ` `{ ` `    ``char``[] a = input.ToCharArray(); ` `    ``int` `l, r = a.Length - 1; ` `     `  `    ``for``(l = 0; l < r; l++, r--) ` `    ``{ ` `       ``char` `temp = a[l]; ` `       ``a[l] = a[r]; ` `       ``a[r] = temp; ` `    ``} ` `    ``return` `String.Join(``""``, a); ` `} ` ` `  `// Driver Code ` `public` `static` `void` `Main(String[] args) ` `{ ` ` `  `    ``// Given String ` `    ``String str = ``"abaab"``; ` ` `  `    ``// Function Call ` `    ``longestPalindromicPrefix(str); ` `} ` `} ` ` `  `// This code is contributed by Rajput-Ji `

Output:

```aba
```

Time Complexity: O(N), where N is the length of the given string.
Auxiliary Space: O(N), where N is the length of the given string.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.

Article Tags :
Practice Tags :

Be the First to upvote.

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.