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.
For example:
Given "aacecaaa"
, return "aaacecaaa"
.
Given "abcd"
, return "dcbabcd"
.
public class Solution { public String shortestPalindrome(String s) { if (s == null || s.length() == 0) { return ""; } String copy = s; StringBuffer stringBuffer = new StringBuffer(s); StringBuffer reverse = stringBuffer.reverse(); s = reverse.toString(); char[] charArr = manacherString(s); int[] pArr = new int[charArr.length]; int index = -1; int pR = -1; int max = -1; for (int i = 0; i < pArr.length; i++) { pArr[i] = pR > i ? Math.min(pArr[2 * index - i], pR - i) : 1; while (i + pArr[i] < charArr.length && i - pArr[i] > -1) { if (charArr[i + pArr[i]] == charArr[i - pArr[i]]) { pArr[i]++; } else { break; } } if (i + pArr[i] > pR) { pR = i + pArr[i]; index = i; } if (pR == charArr.length) { max = pArr[i]; break; } } char[] tmp = new char[s.length() - max + 1]; for (int i = 0; i < tmp.length; i++) { tmp[tmp.length - 1 - i] = charArr[i * 2 + 1]; } return new StringBuffer(new String(tmp)).reverse() + copy; } private char[] manacherString(String s) { // TODO Auto-generated method stub char[] charArray = s.toCharArray(); char[] res = new char[s.length() * 2 + 1]; int index = 0; for (int i = 0; i < res.length; i++) { res[i] = (i & 1) == 0 ? '#' : charArray[index++]; } return res; } }