5. 最长回文子串

题目:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:
输入: "cbbd"
输出: "bb"

代码:

暴力法: 超时
class Solution {
public String longestPalindrome(String s) {
int len=s.length();
int left=0,right=0;
int count1=0 ,count2=0;
int k=0;
if(len0||len1){
return s;
}
for(int i=0;i<len-1;i++){
if(s.charAt(i)s.charAt(i+1)){
count2=2;
left=i-1;
right=i+2;
while(left>=0&&right<len){
if(s.charAt(left)
s.charAt(right)){
left--;
right++;
count2+=2;
}
}
if(count1<count2){
count1=count2;
k=left+1;
}
}
else{
count2=1;
left=i-1;
right=i+1;
while(left>=0&&right<len){
if(s.charAt(left)==s.charAt(right)){
left--;
right++;
count2+=2;
}
}
if(count1<count2){
count1=count2;
k=left+1;
}
}
}
return s.substring(k,k+count1) ;

}    

}

解法二: 极度低效

代码:
class Solution {
public String longestPalindrome(String s) {
int len =s.length();

 if(len==1||len==0){  //空串和长度为1直接返回
     return s;
 }

 int[][] str_len=new int[len][len]; 
   for(int i=0;i<len;i++){    //初始化
     for(int j=0;j<len;j++){
      str_len[i][j]=-1;
      }
      str_len[i][i]=1;  //字串长为1,必是回文串
     }

     for(int i=0;i<len;i++){    //初始化
     for(int j=i+1;j<len;j++){
      if(str_len[i][j]<0){
        fun( s, i, j, str_len);
      }
      }
    }

       fun( s, 0, len-1, str_len);
    //找出最长回文子串
    int temp=1,k=0;
    for(int i=0;i<len;i++){    //初始化
     for(int j=i+1;j<len;j++){
      if(str_len[i][j]>temp){
          k=i;
          temp=str_len[i][j];
      }
      }
    }
    return s.substring(k,k+temp);
}

public static void fun(String s,int i,int j,int[][] str_len) {    

 int k=0,maxlen=1;
 if(i==j){
     return ;
 }             
 if(j==i+1){ //字串长为2单独处理
    str_len[i][j]=(s.charAt(i)==s.charAt(j))?2:0;
    return;}

 if(str_len[i+1][j-1]==-1){
              fun( s,i+1, j-1, str_len);
        }
        
if(str_len[i+1][j-1]>0&&(s.charAt(i)==s.charAt(j))) {  
           str_len[i][j]=str_len[i+1][j-1]+2;
}
else{
             str_len[i][j]=0;
}
     }      

}

posted @ 2020-12-05 12:40  堤苏白  阅读(181)  评论(0)    收藏  举报