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"
给一个字符串s,允许在它的前面加字符使其变成回文字符串,找出最短的回文字符串。
用brute force无法通过OJ,需要用比较巧妙的方法来解。可以用KMP算法或者Manacher's算法。
参考:从头到尾彻底理解KMP
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