Minimum characters to be added at front to make string palindrome

16 Jun, 2022
Given a string str we need to tell minimum characters to be added at front of 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 wither a palindrome or empty 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++
Java
Python 3
C#
Javascript
// 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 notbool 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 codeint 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 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 program for getting minimum character# to be added at front to make string palindrome # function for checking string is# palindrome or notdef 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 codeif __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# 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
<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>
Output:  
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 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 represent longest proper prefix which is also suffix. We can use this lps array for solving 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 character needed to make the string a palindrome is length of the input string minus last entry of our lps array. Please see below code for better understanding 
C++
Java
Python3
C#
Javascript
// 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 strvector<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 palindromeint 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 functionsint main(){    string str = "AACECAAAA";    cout << getMinCharToAddedToMakeStringPalin(str);    return 0;}
// Java program for getting minimum character to be// added at front to make string palindromeimport java.util.*;class GFG{ // returns vector lps for given string strpublic 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 palindromestatic 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 Codepublic static void main(String args[]){    String str = "AACECAAAA";    System.out.println(getMinCharToAddedToMakeStringPalin(str));}} // This code is contributed by Sparsh Singhal
# Python3 program for getting minimum# character to be added at the front# to make string palindrome # Returns vector lps for given string strdef 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 palindromedef 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 Codeif __name__ == "__main__":     string = "AACECAAAA"    print(getMinCharToAddedToMakeStringPalin(string))     # This code is contributed by Rituraj Jain
// 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
<script> // JavaScript program for getting minimum character to be// added at front to make string palindrome // returns vector lps for given string strfunction 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 palindromefunction 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 functionslet str = "AACECAAAA";document.write(getMinCharToAddedToMakeStringPalin(str)); // This code is contributed by shinjanpatra </script>
Output:  
2
Time complexity: O(n)
Auxiliary Space: O(n)
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 you want to share more information about the topic discussed above. 
29AjayKumar
princiraj1992
ukasp
rituraj_jain
hemant_dhanuka
sparsh singhal
avanitrachhadiya2155
lokeshpotta20
kk9826225
shinjanpatra
simmytarika5
riya55
palindrome
Strings
Strings
palindrome
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Write a program to reverse an array or string
Reverse a string in Java
Write a program to print all permutations of a given string
C++ Data Types
Different Methods to Reverse a String in C++
Python program to check if a string is palindrome or not
Longest Common Subsequence | DP-4
Check for Balanced Brackets in an expression (well-formedness) using Stack
Length of the longest substring without repeating characters
Convert string to char array in C++