三种方法
暴力
提示:这里可以添加要学的内容
public static String longestPalindrome(String s) {
if (s.length () == 0)
return null;
int resultLeft = 0, resultRight = 0;
int longest = 1;
for (int i = 0; i < s.length (); i++) {
for (int j = i+1; j < s.length (); j++) {
//这里的优化很关键
if (j-i+1>longest&&estimate ( s, i, j )) {
if ((j - i + 1) > longest) {
longest = j - i + 1;
resultLeft = i;
resultRight = j;
}
}
}
}
String result = s.substring ( resultLeft, resultRight+1 );
return result;
}
public static boolean estimate(String s,int head,int tail ){
while(head<tail){
if(s.charAt ( head )!=s.charAt ( tail ))
return false;
head++;
tail--;
}
return true;
}
中心扩散
提示:这里可以添加要学的内容
public static String longestPalindrome1(String s) {
if(s.length ()==0)
return null;
char[] chars=s.toCharArray ();
int start=0,end=0;
for(int i=0;i<s.length ();i++){
int len1=anagrams ( chars,i,i );
int len2=anagrams ( chars,i,i+1);
int len=Math.max ( len1,len2 );
if(len>end-start+1){
start=i-(len-1)/2;
end=i+len/2;
}
}
String result =s.substring ( start,end+1);
return result;
}
public static int anagrams(char[] ch,int i,int j){
while (i>=0&&j<ch.length&&ch[i]==ch[j]){
i--;
j++;
}
return j-i-1;
}
动态规划
public static String longestPalindrome2(String s){
if(s.length ()==0)
return null;
if(s.length ()==1)
return s;
boolean[][] dp=new boolean[s.length ()][s.length ()];
for(int i=0;i<s.length ();i++){
dp[i][i]=true;
}
int head=0,tail=0;
for(int len=2;len<=s.length ();len++){
for(int i=0;i<s.length ();i++){
int j=i+len-1;
if(j>=s.length ())
break;
if(s.charAt ( i )!=s.charAt ( j )){
dp[i][j]=false;
}else{
if(j-i<3){
dp[i][j]= true;
}else{
dp[i][j]=dp[i+1][j-1];
}
}
if(dp[i][j]&&j-i+1>tail-head){
head=i;
tail=j;
}
}
}
return s.substring ( head,tail+1 );
}