标签:length ems div detail bre tput arc http sea
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"
Approach #1: Brute Force. [Java] [364 ms]
class Solution {
public String shortestPalindrome(String s) {
int n = s.length();
if (n < 2) return s;
for (int i = n-2; i >= 0; --i) {
if (checkEven(i, s)) {
String substr = s.substring(2*i+2);
for (int j = 0; j < substr.length(); ++j)
s = substr.charAt(j) + s;
return s;
} else if (checkOod(i, s)) {
String substr = s.substring(2*i+1);
for (int j = 0; j < substr.length(); ++j)
s = substr.charAt(j) + s;
return s;
}
}
return s;
}
boolean checkEven(int idx, String s) {
int l = idx, r = idx + 1;
while (l >= 0 && r < s.length()) {
if (s.charAt(l) == s.charAt(r)) {
l--;
r++;
} else {
break;
}
}
if (l == -1 && r <= s.length()) return true;
else return false;
}
boolean checkOod(int idx, String s) {
int l = idx, r = idx;
while (l >= 0 && r < s.length()) {
if (s.charAt(l) == s.charAt(r)) {
l--;
r++;
} else {
break;
}
}
if (l == -1 && r <= s.length()) return true;
else return false;
}
}
Approach #2: KMP. [Java] [3ms]
class Solution {
public String shortestPalindrome(String s) {
String temp = s + "#" + new StringBuilder(s).reverse().toString();
int[] table = getTable(temp);
return new StringBuilder(s.substring(table[table.length-1])).reverse().toString() + s;
}
public int[] getTable(String s) {
int[] table = new int[s.length()];
int len = 0, i = 1;
table[0] = 0;
while (i < s.length()) {
if (s.charAt(i) == s.charAt(len)) {
len++;
table[i] = len;
i++;
} else {
if (len != 0) {
len = table[len-1];
} else {
table[i] = len;
i++;
}
}
}
return table;
}
}
Reference:
https://www.geeksforgeeks.org/java-program-for-kmp-algorithm-for-pattern-searching-2/
标签:length ems div detail bre tput arc http sea
原文地址:https://www.cnblogs.com/ruruozhenhao/p/10712465.html