Given a string s, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.
Example 1:
Input:"aacecaaa"
Output:"aaacecaaa"
Example 2:
Input:"abcd"
Output:"dcbabcd"
Given a string s, allow characters to be added in front of it to make it a palindrome, find the shortest palindrome.
It is impossible to pass OJ with brute force, and a more ingenious method is needed to solve it. KMP algorithm or Manacher's algorithm can be used.
Reference: Thoroughly understand KMP from start to finish
Python: KMP
class Solution(object): def shortestPalindrome(self, s): def getPrefix(pattern): prefix = [-1] * len(pattern) j = -1 for i in xrange(1, len(pattern)): while j > -1 and pattern[j+1] != pattern[i]: j = prefix[j] if pattern[j+1] == pattern[i]: j += 1 prefix[i] = j return prefix if not s: return s A = s + s[::-1] prefix = getPrefix(A) i = prefix[-1] while i >= len(s): i = prefix[i] return s[i+1:][::-1] + s
Python: Manacher's
class Solution(object): def shortestPalindrome(self, s): def preProcess(s): if not s: return ['^', '$'] string = ['^'] for c in s: string += ['#', c] string += ['#', '$'] return string string = preProcess(s) palindrome = [0] * len (string) center, right = 0, 0 for i in xrange(1, len(string) - 1): i_mirror = 2 * center - i if right > i: palindrome[i] = min(right - i, palindrome[i_mirror]) else: palindrome[i] = 0 while string[i + 1 + palindrome[i]] == string[i - 1 - palindrome[i]]: palindrome[i] += 1 if i + palindrome[i] > right: center, right = i, i + palindrome[i] max_len = 0 for i in xrange(1, len(string) - 1): if i - palindrome[i] == 1: max_len = palindrome[i] return s[len(s)-1:max_len-1:-1] + s
All LeetCode Questions List