5.最长的回文子串

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

解第一版:
1、DP求解,定义出错,定义a[i][j] = k表示长度 i+2 的字符串 s[ j 到 k ]示回文
2、这种定义没有利用好DP的优势回避奇偶回文辨别
3、例:

/*
   a b b a  和 a b a
   [0]应该存什么?
                */ 
class Solution {
    public String longestPalindrome(String s) {
        if(s.length()<2)
            return s;
        int n= s.length();
        int[][] a= new int[n][n];
        
        for(int i=0; i<n-1; i++){
            if(s.charAt(i) == s.charAt(i+1))
                a[0][i]= i+1;
            if(i!=0 && ( s.charAt(i-1) == s.charAt(i+1)) )
                a[1][i-1] = i+1;
        }
        
        for(int i=2; i<n; i++){
            for(int j =0; j<n-1; j++){
                /*
                a b b a  和 a b a
                [0]应该存什么?
                */ 
               if(a[i-2][j+1]!=0 && a[i-2][j+1]+1<n  
                  &&  s.charAt(j) ==  s.charAt(a[i-2][j+1]+1 )  )
                  a[i][j] = a[i-2][j+1]+1;
               if(a[i-1][j+1]!=0 &&  a[i-1][j+1]+1<n  
                  &&  s.charAt(j) ==  s.charAt(a[i-1][j+1]+1 )  )
                   a[i][j] = a[i-1][j+1]+1 ;
            } 
        }
        
        for(int i=n-1; i>=0; i--){
            for(int j=0; j<n ;j++){
                System.out.print(a[i][j] + " ");
                if(a[i][j]!=0)
                    return s.substring(j,a[i][j]+1);
            }
            System.out.println();
        }
        return ""+s.charAt(n-1);
    }
}

解答第二版:

class Solution {
    public String longestPalindrome(String s) {
        int n= s.length();
        if(n<2)
            return s;
        boolean[][] a= new boolean[n][n];
        String ans = s.substring(n-1,n);
        int maxLen = 1;
        
        //这个双重循环卡了我很久,大脑没转过来
        for(int j=1; j<n ; j++){
            for(int i=0; i<j; i++){
                /*
                合并 aa 、aba两种情况
                  if( i<n-1 && s.charAt(i)== s.charAt(i+1))
                  if( i<n-2 && s.charAt(i) == s.charAt(i+2))
                */
                if(s.charAt(i) == s.charAt(j) &&( j-i<=2 ||a[i+1][j-1]) ){
                    a[i][j] = true;
                    if((j-i+1)>maxLen){
                        maxLen = j-i+1;
                        ans = s.substring(i,j+1);
                    }
                }
            }
        }
        return ans;   
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值