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 @   堤苏白  阅读(176)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示