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"
.
Solution:
1. O(n * lgn)
check if substring(0, end) is palindrome or not, end from s.length() to 1. If is palindrome, reverse substring(end, length()) + s
this solution will LSE
public String shortestPalindrome(String s) { if(s.length() <=1) return s; int right = s.length(); for(int i = right-1; i>=0; i--) { if(isPalindrome(s, i)) { StringBuilder sb = new StringBuilder(s.substring(i+1)); sb.reverse(); return sb.toString() + s; } } return ""; } public boolean isPalindrome(String s, int right) { int left = 0; while(left<=right) { if(s.charAt(left) != s.charAt(right)) return false; right--; left++; } return true; }
2. Improve from middle search, O(logn * logn)
public String shortestPalindrome(String s) { if(s.length() <=1) return s; int center = (s.length() - 1) /2; String res = ""; for(int i = center; i>=0; i--) { if(s.charAt(i) == s.charAt(i+1)){ if((res = isPalindrome(s, i, i+1)) != null) return res; } if((res = isPalindrome(s, i, i)) != null) return res; } return res; } public String isPalindrome(String s, int left, int right) { int i = 1; for(;left-i>=0 && right+i< s.length(); i++) { if(s.charAt(left-i) != s.charAt(right+i)) break; } if(left-i>=0) return null; StringBuilder sb = new StringBuilder(s.substring(right+i)); sb.reverse(); return sb + s; }