LeetCode——5.最长回文子串

本文探讨了两种寻找最长回文子串的高效算法:暴力破解与中心扩展。中心扩展方法通过逐步扩展中心点或双点,有效避免了不必要的子串判断,从而在LeetCode上实现AC。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 暴力破解: 使用两个for循环取出所有子串,再判断是不是回文,比较长度。

时间复杂度是o(n^3),在LeetCode上是无法AC的。

2. 中心扩展:遍历字符串,以每一个点或两个点作为回文串的中心,向左右扩散,直到左右不相等,作为一个回文子串,再通过比较长度,取最长的。

public String longestPalindrome(String s) {
        int len = s.length();
        if (len == 0) {
            return "";
        }
        int longestPalindrome = 1;
        String longestPalindromeStr = s.substring(0, 1);
        for (int i = 0; i < len; i++) {
            String palindromeOdd = centerSpread(s, len, i, i);
            String palindromeEven = centerSpread(s, len, i, i + 1);
            String maxLenStr = palindromeOdd.length() > palindromeEven.length() ? palindromeOdd : palindromeEven;
            if (maxLenStr.length() > longestPalindrome) {
                longestPalindrome = maxLenStr.length();
                longestPalindromeStr = maxLenStr;
            }
        }
        return longestPalindromeStr;
    }

    private String centerSpread(String s, int len, int left, int right) {
        int l = left;
        int r = right;
        while (l >= 0 && r < len && s.charAt(l) == s.charAt(r)) {
            l--;
            r++;
        }
        // 这里要特别小心,跳出 while 循环的时候,是第 1 个满足 s.charAt(l) != s.charAt(r) 的时候
        // 所以,不能取 l,不能取 r
        return s.substring(l + 1, r);
    }

注:若以一个中心,则进函数时s.charAt(l) == s.charAt(r)

       若回文串为偶数,以两个字符为中心,则这两个字符必须是一样的,如果不一样不可能是回文,也就不会进while循环。若字符不一样,此时l + 1= r,【r,r)中没有元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值