力扣刷题5.最长回文子串(Java)

英文题目

Longest Palindromic Substring
最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
给一个字符串 s 找到最长回文子串 在 s 中,你将给字符串最长 1000

Example 1:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Example 2:

Input: "cbbd"
Output: "bb"

思路:

思路一: 中心扩展法

从’aba’ 和 ‘aa’ 从数的中间去找最大的子串 中心的可能为 2n-1 n为字符串长
特殊情况 s 为空 或者为 “”

class Solution {
    public String longestPalindrome(String s) {
        if(s==null || s.length() < 1){
            return "";
        }
        int start = 0, end = 0;

        for(int i = 0 ; i < s.length(); i ++) {
            int length1 = getPalindrome(s, i, i); //中心就是 i
            int length2 = getPalindrome(s, i, i+1);//中心是 i与 i+1 的中间
            int len = Math.max(length1, length2);
            if(len > end - start){
                start = i - (len -1)/2;//-1 是为了考虑 这种  abba 的情况
                end = i + len/2;
            }
        }
        return s.substring(start, end + 1);
    }
    private int getPalindrome(String s, int left, int right){
        //left > = 0 的原因是 s.charAt(left) 还要判断 0    而right  只到 s.length() - 1  因此 最后 left  是他的前一个值    
        while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)){
                left--;
                right++;
        }
        return right - left - 1 ;
    }
    
}

思路二: 暴力法

将每一个子串拿出来进行比较
比较算法比较简单 判断左右是否相等
不能通过

class Solution {
    public String longestPalindrome(String s) {
        if(s==null || s.length() < 1){
            return "";
        }
        int start = 0, end = 1;
        int len = s.length();
       for(int i = 0; i < len; i++){
           for(int j = i+1; j <= len; j++){
               String sub = s.substring(i,j);
               if(getPalindrome(sub) && j -i > end - start){
                   end = j;
                   start = i;
               }
           }
       }
        return s.substring(start, end);
    }
 
    private boolean getPalindrome(String s){
        int len = s.length();
        for(int i = 0; i < len /2; i++){
            if(s.charAt(i) != s.charAt(len - i -1)){
                return false;
            }
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值