最长回文子串

这篇博客介绍了如何用中心扩展法解决LeetCode中的第5题——寻找给定字符串中最长的回文子串。博主首先阐述了暴力求解的思路,即遍历所有子串并检查其是否为回文,但这种方法的时间复杂度较高。接着,博主提出了一种优化方案——中心扩展法,分别针对单核和双核回文进行查找,显著降低了时间复杂度。通过示例代码详细解释了这种方法的工作原理。
摘要由CSDN通过智能技术生成

最长回文子串
LeetCode题库 第5题

给定一个字符串 s,找到 s 中最长的回文子串
回文串(palindromic string)是指这个字符串无论从左读还是从右读,所读的顺序是一样的;简而言之,回文串是左右对称的。

示例 1:
输入: “babad” 输出: “bab” 注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd” 输出: “bb”

代码
一:暴力求解

在这里插 /**
     * O(n^3)时间复杂度方法——暴力求解
     * 1.思想:
     * 1)从最长的子串开始,遍历所有该原字符串的子串;
     * 2)每找出一个字符串,就判断该字符串是否为回文;
     * 3)子串为回文时,则找到了最长的回文子串,因此结束;反之,则继续遍历。
     * 2.时间复杂度解释:
     * 遍历字符串子串:嵌套一个循环、O(n^2);
     * 判断是否为回文:再次嵌套一个循环、O(n^3)。
     */
    public static String longestPalindrome(String s) {
        if (s.length() <= 1)
            return s;
        for (int i = s.length(); i > 0; i--) {//子串长度,从最长子段开始,若是回文子串,就可以直接返回
            for (int j = 0; j <= s.length() - i; j++) { //根据子串长度,限制应该截取的子串在s中的开头位置
                String sub = s.substring(j, i + j);//子串位置  i子串长度 j为起始位置 截取的范围就从j 到 j+i  substring左闭右开
                int count = 0;//计数,用来判断是否对称
                for (int k = 0; k < sub.length() / 2; k++) {//左右对称判断
                    if (sub.charAt(k) == sub.charAt(sub.length() - k - 1)) {
                        count++;
                    } else {
                        break;
                    }
                }
                if (count == sub.length() / 2)
                    return sub;
            }
        }
        return "";//表示字符串中无回文子串
    }

二:中心扩展解法

/**
     * "bbcbcadd"
     * 分两种情况 回文子串为单核回文 例 “aba”  双核回文 例 “abba”
     */
    private static String sub = "";
    private static int length = 0;

    public static String longestPalindrome1(String s) {
        if (s.length() <= 1)
            return s;
        for (int i = 0; i < s.length() - 1; i++) {//除去字符串最后一个字符之外的所有字符
            findLongestPalindrome1(s, i, i);//单核回文查询
            findLongestPalindrome1(s, i, i + 1);//双核回文查询
        }
        return sub;
    }

    private static void findLongestPalindrome1(String s, int left, int right) {
        while (left >= 0 && right <= s.length() - 1) {
            if (s.charAt(left) == s.charAt(right)) {
                if(length < right-left+1){
                    length = right-left+1;
                    sub = s.substring(left,right+1);
                }
                left--;
                right++;
            }else{
                break;
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值