# Minimum insertions to form shortest palindrome

Given a string S, determine the least number of characters that should be added on to the left side of S so that the complete string becomes a palindrome.

Examples:

```Input: S = "LOL"
Output: 0

Input: S = "JAVA"
Output: 3
We need to add 3 characters to form AVAJAVA.
```

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

The idea is to find the longest palindromic prefix of given string. The count of characters after the prefix is our answer. The longest palindromic prefix can be found by looping from last char to first char. For example, in “JAVA”, the longest palindromic prefix is “J”, so we need to add remaining 3 at the beginning characters to form palindrome.

## C++

 `// C++ program to find minimum number of insertions ` `// on left side to form a palindrome. ` ` `  `#include ` `using` `namespace` `std; ` ` `  `// Returns true if a string str[st..end] is palindrome ` `bool` `isPalin(``char` `str[], ``int` `st, ``int` `end) ` `{ ` `    ``while` `(st < end) ` `    ``{ ` `        ``if` `(str[st] != str[end]) ` `            ``return` `false``; ` `        ``st++; ` `        ``end--; ` `    ``} ` `    ``return` `true``; ` `} ` ` `  `// Returns count of insertions on left side to make ` `// str[] a palindrome ` `int` `findMinInsert(``char` `str[], ``int` `n) ` `{ ` `    ``// Find the largest prefix of given string ` `    ``// that is palindrome. ` `    ``for` `(``int` `i=n-1; i>=0; i--) ` `    ``{          ` `        ``// Characters after the palindromic prefix ` `        ``// must be added at the beginning also to make ` `        ``// the complete string palindrome ` `        ``if` `(isPalin(str, 0, i)) ` `            ``return` `(n-i-1); ` `    ``} ` `} ` ` `  `// Driver program ` `int` `main() ` `{ ` `    ``char` `Input[] = ``"JAVA"``; ` `    ``printf``(``"%d"``, findMinInsert(Input, ``strlen``(Input))); ` `    ``return` `0; ` `} `

## Python 3

 `# Python3 program to find  ` `# minimum number of insertions ` `# on left side to form a palindrome. ` ` `  `# Returns true if a string ` `# str[st..end] is palindrome ` `def` `isPalin(``str``, st, end): ` ` `  `    ``while` `(st < end): ` `     `  `        ``if` `(``str``[st] !``=` `str``[end]): ` `            ``return` `False` `        ``st ``+``=` `1` `        ``end``-``-``1` `     `  `    ``return` `True` ` `  ` `  `# Returns count of insertions ` `# on left side to make ` `# str[] a palindrome ` `def` `findMinInsert(``str``, n): ` ` `  `    ``# Find the largest  ` `    ``# prefix of given string ` `    ``# that is palindrome. ` `    ``for` `i ``in` `range``(n``-``1` `,``-``1``, ``-``1``): ` `             `  `        ``# Characters after the  ` `        ``# palindromic prefix must ` `        ``# be added at the beginning  ` `        ``# also to make the complete  ` `        ``# string palindrome ` `        ``if` `(isPalin(``str``, ``0``, i)): ` `            ``return` `(n ``-` `i ``-` `1``) ` ` `  `# Driver Code ` `Input` `=` `"JAVA"` `print``(findMinInsert(``Input``,  ` `                    ``len``(``Input``))) ` ` `  `# This code is contributed ` `# by Smitha `

Output:

`3`

Time Complexity:
O(n2)

Thanks to Utkarsh Trivedi for suggesting this solution.

My Personal Notes arrow_drop_up

Improved By : Smitha Dinesh Semwal

Article Tags :
Practice Tags :

1

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