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
Understand the problem:"abcd", return "dcbabcd".The straight-forward solution is: find the longest palindrome substring starting with s[0]. Then insert the remaining of the string s to the front in a reverse order.
Code (Java):
public class Solution {
public String shortestPalindrome(String s) {
if (s == null || s.length() == 0) {
return "";
}
int maxLen = 0;
// Step 1: find the longest palindromic substring including s.charAt(0)
for (int i = 0; i < s.length(); i++) {
// Odd
int p = i - 1;
int q = i + 1;
int len = 1;
while (p >= 0 && q < s.length() && s.charAt(p) == s.charAt(q)) {
len += 2;
p--;
q++;
}
if (p == -1 && len > maxLen) {
maxLen = len;
}
// Even
p = i;
q = i + 1;
len = 0;
while (p >= 0 && q < s.length() && s.charAt(p) == s.charAt(q)) {
p--;
q++;
len += 2;
}
if (p == -1 && len > maxLen) {
maxLen = len;
}
}
int j = maxLen;
StringBuffer sb = new StringBuffer();
for (int m = s.length() - 1; m >= j; m--) {
sb.append(s.charAt(m));
}
sb.append(s);
return sb.toString();
}
}
Analysis:
The time complexity to find out the longest palindrome substring starting from s[0] is O(n^2). So the overall time complexity is O(n^2) as well.
KMP solution:
Unfortunate thing is - similar C++ solution is yielding Time Limit exceed :)
ReplyDelete