Print the longest palindromic prefix of a given string
Last Updated : 07 Jul, 2021
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".
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 <bits/stdc++.h> 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
JavaScript <script> // JavaScript program for the above approach // Function to find the longest prefix // which is palindromic function LongestPalindromicPrefix(s) { // Find the length of the given String let n = s.length; // For storing the length of longest // prefix palindrome let max_len = 0; // Loop to check the subString of all // length from 1 to N which is palindrome for (let len = 1; len <= n; len++) { // String of length i let temp = s.substring(0, len); // To store the reversed of temp let temp2 = temp; // Reversing String temp2 temp2 = reverse(temp2); // If String temp is palindromic // then update the length if (temp == temp2) { max_len = len; } } // Print the palindromic String of // max_len document.write(s.substring(0, max_len)); } function reverse(input) { let a = input.split(''); let l, r = a.length - 1; for (l = 0; l < r; l++, r--) { let temp = a[l]; a[l] = a[r]; a[r] = temp; } return a.join(""); } // Given String let str = "abaab"; // Function Call LongestPalindromicPrefix(str); </script>
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:
- Create a temporary string(say str2) which is:
str2 = str + '?' reverse(str);
- 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.
- Update the lps[] by using preprocessing algorithm of KMP Search Algorithm.
- 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 <bits/stdc++.h> 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]; // Initialise 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 increment // 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]; // Initialise 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 increment // 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
Python3 # Python3 program for the above approach # Function to find the longest prefix # which is palindromic def LongestPalindromicPrefix(Str): # Create temporary string temp = Str + "?" # Reverse the string Str Str = Str[::-1] # Append string Str to temp temp = temp + Str # Find the length of string temp n = len(temp) # lps[] array for string temp lps = [0] * n # Iterate the string temp for i in range(1, n): # Length of longest prefix # till less than i Len = lps[i - 1] # Calculate length for i+1 while (Len > 0 and temp[Len] != temp[i]): Len = lps[Len - 1] # If character at current index # Len are same then increment # length by 1 if (temp[i] == temp[Len]): Len += 1 # Update the length at current # index to Len lps[i] = Len # Print the palindromic string # of max_len print(temp[0 : lps[n - 1]]) # Driver Code if __name__ == '__main__': # Given string Str = "abaab" # Function call LongestPalindromicPrefix(Str) # This code is contributed by himanshu77
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 increment // 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
JavaScript <script> // Javascript program for the above approach // Function to find the longest // prefix which is palindromic function longestPalindromicPrefix(str) { // Create temporary String let temp = str + '?'; // Reverse the String str str = reverse(str); // Append String str to temp temp += str; // Find the length of String temp let n = temp.length; // lps[] array for String temp let lps = new Array(n); lps.fill(0); // Iterate the String temp for(let i = 1; i < n; i++) { // Length of longest prefix // till less than i let 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 increment // 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 document.write(temp.substring(0, lps[n - 1])); } function reverse(input) { let a = input.split(''); let l, r = a.length - 1; for(l = 0; l < r; l++, r--) { let temp = a[l]; a[l] = a[r]; a[r] = temp; } return a.join(""); } // Driver code // Given String let str = "abaab"; // Function Call longestPalindromicPrefix(str); // This code is contributed by mukesh07 </script>
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.
Similar Reads
Length of longest palindromic sub-string : Recursion
Given a string S, the task is to find the length of the longest sub-string which is a palindromeExamples: Input: S = "aaaabbaa" Output: 6 Explanation: Sub-string "aabbaa" is the longest palindromic sub-string. Input: S = "banana" Output: 5 Explanation: Sub-string "anana" is the longest palindromic s
6 min read
Print longest palindrome word in a sentence
Given a string str, the task is to print longest palindrome word present in the string str.Examples: Input : Madam Arora teaches Malayalam Output: Malayalam Explanation: The string contains three palindrome words (i.e., Madam, Arora, Malayalam) but the length of Malayalam is greater than the other t
14 min read
Longest palindromic string possible after removal of a substring
Given a string str, the task is to find the longest palindromic string that can be obtained from it after removing a substring. Examples: Input: str = "abcdefghiedcba" Output: "abcdeiedcba" Explanation: Removal of substring "fgh" leaves the remaining string palindromic Input: str = "abba" Output: "a
11 min read
Return a Palindromic String after removing minimum length Prefix from given String
Given a string B, the task is to find the minimum length prefix of the string which, when removed and added to the end of the string, will make the string a palindrome. Return the palindromic string. If no such string exists, we need to determine that. Examples: Input: "aabb"Output: "abba"Explanatio
5 min read
Length of Longest Palindrome Substring
Given a string S of length N, the task is to find the length of the longest palindromic substring from a given string. Examples: Input: S = "abcbab"Output: 5Explanation: string "abcba" is the longest substring that is a palindrome which is of length 5. Input: S = "abcdaa"Output: 2Explanation: string
15+ min read
Longest palindromic string formed by concatenation of prefix and suffix of a string
Given string str, the task is to find the longest palindromic substring formed by the concatenation of the prefix and suffix of the given string str. Examples: Input: str = "rombobinnimor" Output: rominnimor Explanation: The concatenation of string "rombob"(prefix) and "mor"(suffix) is "rombobmor" w
11 min read
Rearrange string to obtain Longest Palindromic Substring
Given string str, the task is to rearrange the given string to obtain the longest palindromic substring. Examples: Input: str = âgeeksforgeeksâOutput: eegksfskgeeorExplanation: eegksfskgee is the longest palindromic substring after rearranging the string.Therefore, the required output is eegksfskgee
9 min read
Print all palindrome permutations of a string
Given a string s, consisting of lowercase Latin characters [a-z]. Find out all the possible palindromes that can be generated using the letters of the string and print them in lexicographical order. Note: Return an empty array if no possible palindromic string can be formed. Examples: Input: s = aab
10 min read
Longest Palindromic Substring using Dynamic Programming
Given a string s, the task is to find the longest substring which is a palindrome. If there are multiple answers, then return the first occurrence of the longest palindromic substring from left to right. Examples: Input: s = "aaaabbaa"Output: "aabbaa"Explanation: The longest palindromic substring is
7 min read
Find the Longest Non-Prefix-Suffix Substring in the Given String
Given a string s of length n. The task is to determine the longest substring t such that t is neither the prefix nor the suffix of string s, and that substring must appear as both prefix and suffix of the string s. If no such string exists, print -1. Example: Input: s = "fixprefixsuffix"Output: fix
7 min read