回文:正序和倒序一样的字符串,如“abccba”,“abcba”。
方法一:暴力搜索
public static String longestPalindrome(String s) {
int len = s.length();
if(len == 1){
return s;
}
int max = 0;
int from=0,to=0;
for(int i=0;i<len;i++){
for(int j=i;j<=len;j++){
String substr = s.substring(i,j);
if((j-i)>max&&isPalindrome(substr)){
max = j-i;
from = i;
to = j;
}
}
}
return s.substring(from,to);
}
//判断是否为回文
public static boolean isPalindrome(String str){
int len = str.length();
if(len == 1){
return true;
}
if(len == 0)
return false;
boolean res = true;
for(int i=0,j=len-1;i<j;i++,j--){
if(!(str.substring(i,i+1).equals(str.substring(j,j+1)))){
res = false;
break;
}
}
return res;
}
方法二:中心扩散
public static String longestPalindrome(String s){
int len = s.length();
if(len<=1)
return s;
String str = null,maxstr = "";
//中心点有两种,一是中心点为i,一是中心点为i和i+1中间的虚点
for(int i=0;i<len-1;i++){
str = getPalindrome(s, i, i);
if(str.length()>maxstr.length())
maxstr = str;
str = getPalindrome(s, i, i+1);
if(str.length()>maxstr.length())
maxstr = str;
}
return maxstr;
}
//获取每个中心点扩散后得到的最长的回文
public static String getPalindrome(String str,int start,int end){
while(start>=0&&end<str.length()&&str.substring(start,start+1).equals(str.substring(end, end+1))){
start--;
end++;
}
return str.substring(start+1, end);
}