5. 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.

Example 1:

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

Example 2:

Input: "cbbd"
Output: "bb

这道题获取最大的回文子集,时间复杂度为O(n^2)

在案例一中可以看到"babad",结果输出的是"bab",可以想到这是对a的中心对称。找到中心数字a,对a的2边进行扩展在比较。

b       a        b
i-1     i        i+1

第二个案例可以看到"cbbd", 结果输出是"bb",可以想到这是对b的轴对称。找到数"b",则第一个b是为i ,第二个b为i+1.

b          b
i          i+1

大致可以确定外环是


for(int i = 0; i < s.length()-1; i++){
    //中心对称则left和right是相同的
    findLongestPalindrome(s, i, i);

    //轴对称则right是left+1
    findLongestPalindrome(s, i, i + 1);
}

接下来要返回确定的回文数,入参需要String s, int left, int right。

循环的条件是第left和第right的字符相同,left-- 左移,right++右移。其限制条件是left>=0, right<s.length().

最后使用s.substring(left+1, right)输出。(因为在跳出循环圈left很有可能-1,造成越界,substirng(0,2)的即输出0,1上的字符)

    private static String findLongestPalindrome(String s, int left , int right){
        
        while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)){
            left--;
            right++;
        }
        return s.substring(left+1,right);
    }

 

获取到最长最长回文子集。初始化一个result,来比较回文子集长度,最终得到最长的回文子集

 private static String longestPalindrome(String s){

        if(s.length() ==1){
            return s;
        }

        String result = "";
        
            for(int i = 0; i < s.length()-1; i++){
                String longestPalindrome = findLongestPalindrome(s, i, i);

                if (longestPalindrome.length() > result.length()){
                    result = longestPalindrome;
                }

                String longestPalindrome1 = findLongestPalindrome(s, i, i + 1);

                if (longestPalindrome1.length() > result.length()){
                    result = longestPalindrome1;
                }
            }
            return result;
        }

 

leetcode结果

class Solution {
    public String longestPalindrome(String s) {
        if(s.length()==1){
            return s;
        }
        
        String result = "";
        for(int i = 0; i < s.length()-1; i++){
            String longestPalindrome = findLongestPalindrome(s, i, i);

            if (longestPalindrome.length() > result.length()){
                result = longestPalindrome;
            }

            String longestPalindrome1 = findLongestPalindrome(s, i, i + 1);

            if (longestPalindrome1.length() > result.length()){
                result = longestPalindrome1;
            }
        }
        return result;
    }
    
      private static String findLongestPalindrome(String s, int left , int right){
        
        while(left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)){
            left--;
            right++;
        }
        return s.substring(left+1,right);
    }
    
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值