1 public class Solution { 2 public String shortestPalindrome(String s) { 3 if (s.length() < 2) { 4 return s; 5 } 6 String newS = s + "#" + new StringBuilder(s).reverse().toString(); 7 int[] pos = new int[newS.length()]; 8 9 for (int i = 1; i < newS.length(); i++) { 10 int prePos = pos[i - 1]; 11 while (prePos > 0 && newS.charAt(prePos) != newS.charAt(i)) { 12 prePos = pos[prePos - 1]; 13 } 14 pos[i] = prePos + ((newS.charAt(i) == newS.charAt(prePos)) ? 1 : 0); 15 } 16 return new StringBuilder(s.substring(pos[pos.length - 1])).reverse().toString() + s; 17 } 18 }
KMP