题目
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".
思路一:报超时
先判断s是否为回文字符串,如果不是,则根据回文的特征在s的前面逐渐的添加字符,并判断是否是回文字符,如果是,则返回,如果还不是,则继续添加。直至其为回文字符串。
实现代码如下:
public String shortestPalindrome(String s) {
if(s==null||s.length()<1||isPalindrome(s)){
return s;
}
//如果s不是回文字符,则在字符串前面添加字符使其为回文字符串
int len = s.length();
String ss = s;
for(int i=len-1;i>=0;i--){
s = s.substring(0, len-1-i)+ss.charAt(i)+s.substring(len-1-i);
if(isPalindrome(s)){
return s;
}
}
return s;
}
//判断一个字符串是否是palindrome
private boolean isPalindrome(String str) {
if(str==null||str.length()<1){
return false;
}
int begin = 0;
int end = str.length()-1;
while(begin<end){
if(str.charAt(begin)!=str.charAt(end)){
return false;
}
begin++;
end--;
}
return true;
}
思路二
思路二是思路一的变种,思路如下:
找出以s[0]为起点的最大回文字符子串。剩下的字符串翻转+最大字符子串+剩下的字符就是我们所要求的结果。
实现代码如下:
public String shortestPalindrome(String s) {
if(s==null||s.length()<1||isPalindrome(s)){
return s;
}
//如果s不是回文字符,则在字符串前面添加字符使其为回文字符串
int len = s.length();
String str =new String();
int i = len;
for(;i>=0;i--){
str = s.substring(0, i);
if(isPalindrome(str)){
break;
}
}
String ss = s.substring(i);
StringBuilder sb = new StringBuilder(ss);
return sb.reverse().append(str).append(ss).toString();
}
//判断一个字符串是否是palindrome
private boolean isPalindrome(String str) {
if(str==null||str.length()<1){
return false;
}
int begin = 0;
int end = str.length()-1;
while(begin<end){
if(str.charAt(begin)!=str.charAt(end)){
return false;
}
begin++;
end--;
}
return true;
}
很可惜,这种也不能AC,报超时
思路三
思路来至于:https://discuss.leetcode.com/topic/21068/my-7-lines-recursive-java-solution
确实经典!!!
public String shortestPalindrome(String s) {
if(s==null||s.length()<1){
return s;
}
//
int len = s.length();
int j = 0;
for(int i=len-1;i>=0;i--){
if(s.charAt(i)==s.charAt(j)){
j++;
}
}
if(j == len){//本身就是回文字符串
return s;
}
String suffix = s.substring(j);
return new StringBuilder(suffix).reverse()+shortestPalindrome(s.substring(0, j))+suffix;
}