Minimum characters to be added at front to make string palindrome
Given string str we need to tell minimum characters to be added in front of the string to make string palindrome.
Examples:
Input : str = "ABC" Output : 2 We can make above string palindrome as "CBABC" by adding 'B' and 'C' at front. Input : str = "AACECAAAA"; Output : 2 We can make above string palindrome as AAAACECAAAA by adding two A's at front of string.
Naive approach: Start checking the string each time if it is a palindrome and if not, then delete the last character and check again. When the string gets reduced to either a palindrome or an empty string then the number of characters deleted from the end till now will be the answer as those characters could have been inserted at the beginning of the original string in the order which will make the string a palindrome.
Below is the implementation of the above approach:
C++
// C++ program for getting minimum character to be // added at front to make string palindrome #include<bits/stdc++.h> using namespace std; // function for checking string is palindrome or not bool ispalindrome(string s) { int l = s.length(); int j; for ( int i = 0, j = l - 1; i <= j; i++, j--) { if (s[i] != s[j]) return false ; } return true ; } // Driver code int main() { string s = "BABABAA" ; int cnt = 0; int flag = 0; while (s.length()>0) { // if string becomes palindrome then break if (ispalindrome(s)) { flag = 1; break ; } else { cnt++; // erase the last element of the string s.erase(s.begin() + s.length() - 1); } } // print the number of insertion at front if (flag) cout << cnt; } |
Java
// Java program for getting minimum character to be // added at front to make string palindrome class GFG { // function for checking string is palindrome or not static boolean ispalindrome(String s) { int l = s.length(); for ( int i = 0 , j = l - 1 ; i <= j; i++, j--) { if (s.charAt(i) != s.charAt(j)) { return false ; } } return true ; } // Driver code public static void main(String[] args) { String s = "BABABAA" ; int cnt = 0 ; int flag = 0 ; while (s.length() > 0 ) { // if string becomes palindrome then break if (ispalindrome(s)) { flag = 1 ; break ; } else { cnt++; // erase the last element of the string s = s.substring( 0 , s.length() - 1 ); //s.erase(s.begin() + s.length() - 1); } } // print the number of insertion at front if (flag == 1 ) { System.out.println(cnt); } } } // This code is contributed by 29AjayKumar |
Python 3
# Python 3 program for getting minimum character # to be added at front to make string palindrome # function for checking string is # palindrome or not def ispalindrome(s): l = len (s) i = 0 j = l - 1 while i < = j: if (s[i] ! = s[j]): return False i + = 1 j - = 1 return True # Driver code if __name__ = = "__main__" : s = "BABABAA" cnt = 0 flag = 0 while ( len (s) > 0 ): # if string becomes palindrome then break if (ispalindrome(s)): flag = 1 break else : cnt + = 1 # erase the last element of the string s = s[: - 1 ] # print the number of insertion at front if (flag): print (cnt) # This code is contributed by ita_c |
C#
// C# program for getting minimum character to be // added at front to make string palindrome using System; public class GFG { // function for checking string is palindrome or not static bool ispalindrome(String s) { int l = s.Length; for ( int i = 0, j = l - 1; i <= j; i++, j--) { if (s[i] != s[j]) { return false ; } } return true ; } // Driver code public static void Main() { String s = "BABABAA" ; int cnt = 0; int flag = 0; while (s.Length > 0) { // if string becomes palindrome then break if (ispalindrome(s)) { flag = 1; break ; } else { cnt++; // erase the last element of the string s = s.Substring(0, s.Length - 1); //s.erase(s.begin() + s.length() - 1); } } // print the number of insertion at front if (flag == 1) { Console.WriteLine(cnt); } } } // This code is contributed by PrinciRaj1992 |
Javascript
<script> // JavaScript Program to implement // the above approach // function for checking string is palindrome or not function ispalindrome(s) { let l = s.length; let j; for (let i = 0, j = l - 1; i <= j; i++, j--) { if (s[i] != s[j]) return false ; } return true ; } // Driver code let s = "BABABAA" ; let cnt = 0; let flag = 0; while (s.length > 0) { // if string becomes palindrome then break if (ispalindrome(s)) { flag = 1; break ; } else { cnt++; // erase the last element of the string s = s.substring(0, s.length - 1); } } // print the number of insertion at front if (flag) document.write(cnt); // This code is contributed by Potta Lokesh </script> |
2
Time complexity: O(n2)
Auxiliary Space: O(1)
Thank you Sanny Kumar for suggesting this approach.
Efficient approach: We can solve this problem efficiently in O(n) time using lps array of KMP algorithm.
First, we concat string by concatenating the given string, a special character and reverse of given string then we will get lps array for this concatenated string, recall that each index of lps array represents the longest proper prefix which is also a suffix. We can use this lps array to solve the problem.
For string = AACECAAAA Concatenated String = AACECAAAA$AAAACECAA LPS array will be {0, 1, 0, 0, 0, 1, 2, 2, 2, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7}
Here we are only interested in the last value of this lps array because it shows us the largest suffix of the reversed string that matches the prefix of the original string i.e these many characters already satisfy the palindrome property. Finally minimum number of characters needed to make the string a palindrome is the length of the input string minus the last entry of our lps array.
Below is the implementation of the above approach:
C++
// C++ program for getting minimum character to be // added at front to make string palindrome #include <bits/stdc++.h> using namespace std; // returns vector lps for given string str vector< int > computeLPSArray(string str) { int M = str.length(); vector< int > lps(M); int len = 0; lps[0] = 0; // lps[0] is always 0 // the loop calculates lps[i] for i = 1 to M-1 int i = 1; while (i < M) { if (str[i] == str[len]) { len++; lps[i] = len; i++; } else // (str[i] != str[len]) { // This is tricky. Consider the example. // AAACAAAA and i = 7. The idea is similar // to search step. if (len != 0) { len = lps[len-1]; // Also, note that we do not increment // i here } else // if (len == 0) { lps[i] = 0; i++; } } } return lps; } // Method returns minimum character to be added at // front to make string palindrome int getMinCharToAddedToMakeStringPalin(string str) { string revStr = str; reverse(revStr.begin(), revStr.end()); // Get concatenation of string, special character // and reverse string string concat = str + "$" + revStr; // Get LPS array of this concatenated string vector< int > lps = computeLPSArray(concat); // By subtracting last entry of lps vector from // string length, we will get our result return (str.length() - lps.back()); } // Driver program to test above functions int main() { string str = "AACECAAAA" ; cout << getMinCharToAddedToMakeStringPalin(str); return 0; } |
Java
// Java program for getting minimum character to be // added at front to make string palindrome import java.util.*; class GFG { // returns vector lps for given string str public static int [] computeLPSArray(String str) { int n = str.length(); int lps[] = new int [n]; int i = 1 , len = 0 ; lps[ 0 ] = 0 ; // lps[0] is always 0 while (i < n) { if (str.charAt(i) == str.charAt(len)) { len++; lps[i] = len; i++; } else { // This is tricky. Consider the example. // AAACAAAA and i = 7. The idea is similar // to search step. if (len != 0 ) { len = lps[len - 1 ]; // Also, note that we do not increment // i here } else { lps[i] = 0 ; i++; } } } return lps; } // Method returns minimum character to be added at // front to make string palindrome static int getMinCharToAddedToMakeStringPalin(String str) { StringBuilder s = new StringBuilder(); s.append(str); // Get concatenation of string, special character // and reverse string String rev = s.reverse().toString(); s.reverse().append( "$" ).append(rev); // Get LPS array of this concatenated string int lps[] = computeLPSArray(s.toString()); return str.length() - lps[s.length() - 1 ]; } // Driver Code public static void main(String args[]) { String str = "AACECAAAA" ; System.out.println(getMinCharToAddedToMakeStringPalin(str)); } } // This code is contributed by Sparsh Singhal |
Python3
# Python3 program for getting minimum # character to be added at the front # to make string palindrome # Returns vector lps for given string str def computeLPSArray(string): M = len (string) lps = [ None ] * M length = 0 lps[ 0 ] = 0 # lps[0] is always 0 # the loop calculates lps[i] # for i = 1 to M-1 i = 1 while i < M: if string[i] = = string[length]: length + = 1 lps[i] = length i + = 1 else : # (str[i] != str[len]) # This is tricky. Consider the example. # AAACAAAA and i = 7. The idea is # similar to search step. if length ! = 0 : length = lps[length - 1 ] # Also, note that we do not # increment i here else : # if (len == 0) lps[i] = 0 i + = 1 return lps # Method returns minimum character # to be added at front to make # string palindrome def getMinCharToAddedToMakeStringPalin(string): revStr = string[:: - 1 ] # Get concatenation of string, # special character and reverse string concat = string + "$" + revStr # Get LPS array of this # concatenated string lps = computeLPSArray(concat) # By subtracting last entry of lps # vector from string length, we # will get our result return len (string) - lps[ - 1 ] # Driver Code if __name__ = = "__main__" : string = "AACECAAAA" print (getMinCharToAddedToMakeStringPalin(string)) # This code is contributed by Rituraj Jain |
C#
// C# program for getting minimum character to be // added at front to make string palindrome using System; using System.Text; public class GFG{ // returns vector lps for given string str public static int [] computeLPSArray( string str) { int n = str.Length; int [] lps = new int [n]; int i = 1, len = 0; lps[0] = 0; // lps[0] is always 0 while (i < n) { if (str[i] == str[len]) { len++; lps[i] = len; i++; } else { // This is tricky. Consider the example. // AAACAAAA and i = 7. The idea is similar // to search step. if (len != 0) { len = lps[len - 1]; // Also, note that we do not increment // i here } else { lps[i] = 0; i++; } } } return lps; } // Method returns minimum character to be added at // front to make string palindrome static int getMinCharToAddedToMakeStringPalin( string str) { char [] s = str.ToCharArray(); // Get concatenation of string, special character // and reverse string Array.Reverse( s ); string rev = new string (s); string concat= str + "$" + rev; // Get LPS array of this concatenated string int [] lps = computeLPSArray(concat); return str.Length - lps[concat.Length - 1]; } // Driver Code static public void Main (){ string str = "AACECAAAA" ; Console.WriteLine(getMinCharToAddedToMakeStringPalin(str)); } } // This code is contributed by avanitrachhadiya2155 |
Javascript
<script> // JavaScript program for getting minimum character to be // added at front to make string palindrome // returns vector lps for given string str function computeLPSArray(str) { let M = str.length; let lps = new Array(M); let len = 0; lps[0] = 0; // lps[0] is always 0 // the loop calculates lps[i] for i = 1 to M-1 let i = 1; while (i < M) { if (str[i] == str[len]) { len++; lps[i] = len; i++; } else // (str[i] != str[len]) { // This is tricky. Consider the example. // AAACAAAA and i = 7. The idea is similar // to search step. if (len != 0) { len = lps[len-1]; // Also, note that we do not increment // i here } else // if (len == 0) { lps[i] = 0; i++; } } } return lps; } // Method returns minimum character to be added at // front to make string palindrome function getMinCharToAddedToMakeStringPalin(str) { let revStr = str.split( '' ).reverse().join( '' ); // Get concatenation of string, special character // and reverse string let concat = str + "$" + revStr; // Get LPS array of this concatenated string let lps = computeLPSArray(concat); // By subtracting last entry of lps vector from // string length, we will get our result return (str.length - lps[lps.length-1]); } // Driver program to test above functions let str = "AACECAAAA" ; document.write(getMinCharToAddedToMakeStringPalin(str)); // This code is contributed by shinjanpatra </script> |
2
Time Complexity: O(n)
Auxiliary Space: O(n)
Another approach using “Two Pointers”:-
- Initialize two pointers start and end to the beginning and end of the string, respectively.
- While start is less than end, if the characters at the start and end pointers are equal, move the start pointer one position to the right and the end pointer one position to the left. If the characters are not equal, increment the res variable (which keeps track of the number of characters that need to be added) and reset the start and end pointers to the beginning and end of the string with a reduced number of characters.
- When start is no longer less than end, return the value of res as the minimum number of characters that need to be added to the front of the string to make it a palindrome.
Here’s the code for above approach:
C++
#include <iostream> #include <string> using namespace std; class Solution { public : int addMinChar(string str1) { int n = str1.length(); int start = 0; int end = n - 1; int res = 0; while (start < end) { // While the pointers have not met in the middle of the string if (str1[start] == str1[end]) { // If the characters at the start and end pointers are equal start++; // Move the start pointer to the right end--; // Move the end pointer to the left } else { res++; // Increment the count of characters to be added start = 0; // Reset the start pointer to the beginning of the string end = n - res - 1; // Reset the end pointer to the end of the string with a reduced number of characters } } return res; // Return the count of characters to be added } }; int main() { Solution sol; string str = "AACECAAAA" ; cout << sol.addMinChar(str) << endl; return 0; } |
Java
class Solution { public int addMinChar(String str1) { int n = str1.length(); int start = 0 ; int end = n - 1 ; int res = 0 ; while (start < end) { // While the pointers have not met in the middle of the string if (str1.charAt(start) == str1.charAt(end)) { // If the characters at the start and end pointers are equal start++; // Move the start pointer to the right end--; // Move the end pointer to the left } else { res++; // Increment the count of characters to be added start = 0 ; // Reset the start pointer to the beginning of the string end = n - res - 1 ; // Reset the end pointer to the end of the string with a reduced number of characters } } return res; // Return the count of characters to be added } } class Main { public static void main(String[] args) { Solution sol = new Solution(); String str = "AACECAAAA" ; System.out.println(sol.addMinChar(str)); } } |
Python3
class Solution: def addMinChar( self , str1): n = len (str1) start = 0 end = n - 1 res = 0 while start < end: # While the pointers have not met in the middle of the string if str1[start] = = str1[end]: # If the characters at the start and end pointers are equal start + = 1 # Move the start pointer to the right end - = 1 # Move the end pointer to the left else : res + = 1 # Increment the count of characters to be added start = 0 # Reset the start pointer to the beginning of the string end = n - res - 1 # Reset the end pointer to the end of the string with a reduced number of characters return res # Return the count of characters to be added if __name__ = = "__main__" : string = "AACECAAAA" print (addMinChar(string)) |
C#
using System; public class Solution { public int AddMinChar( string str1) { int n = str1.Length; int start = 0; int end = n - 1; int res = 0; while (start < end) { if (str1[start] == str1[end]) { start++; end--; } else { res++; start = 0; end = n - res - 1; } } return res; } } public class Program { public static void Main() { string s = "AACECAAAA" ; Solution solution = new Solution(); int result = solution.AddMinChar(s); Console.WriteLine(result); } } |
Javascript
class Solution { addMinChar(str1) { let n = str1.length; let start = 0; let end = n - 1; let res = 0; while (start < end) { if (str1[start] === str1[end]) { start++; end--; } else { res++; start = 0; end = n - res - 1; } } return res; } } let s = "AACECAAAA" ; let solution = new Solution(); let result = solution.addMinChar(s); console.log(result); |
2
The time complexity of this algorithm is O(n), where n is the length of the input string.
The space complexity is O(1), since the algorithm uses only constant extra space.
This article is contributed by Utkarsh Trivedi. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or if you want to share more information about the topic discussed above.
Please Login to comment...