最长回文子串 中心扩展法 —— java实现

最长回文子串 中心扩展法

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

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring

 思路

由于回文串一定是中心对称的,于是我们可以把每一个字母看成是一个中心。沿着它的前后不断搜索,直到遇到不再对称的两个字母为止。最终我们返回长度最长的那个字串就可以了。比如aba,中心是b。

但这是有问题的:

中心真的只有这n个吗?

试想如下字串:abba,它的中心是bb

那如果abbba呢,它的中心可以是bbb也可以是b对吧。这就和第一种情况统一了。

那如果是abbbba呢,事实上它的中心可以时bbbb也可以是bb。这就和第二种情况统一了。

于是归纳出规律:奇数时有n个中心,偶数时有n-1个中心。于是一共有2n-1个中心

那么能不能统一奇数和偶数的情况呢

可以的,我们给每一个字母之间都插上一个特殊字符,比如“#”,这样偶数情况也就变成了奇数情况

接下来我们只需要访问每一个字母,然后向前搜索就可以了。

当然不统一也是可以做的,并且这样做的话性能更高

Java实现

    public static String longestPalindrome(String str){
        //给每两个字母中间插上特殊符号
        str = str.replace("", "#");

        //记录一下回文子串的开始位置和最大长度 当然,记录结束位置也可以
        int start = 0;
        int max = 0;

        //遍历所有字母
        for (int i = 0; i < str.length(); i++){
            
            //以当前字母为中心
            int left = i;
            int right = i;

            //向前向后同时遍历,直到不再对称为止
            while (left>=0 && right max){
                max = thisTimeLength;
                start = left + 1;
            }

        }

        //最终删掉我们加入的特殊符号#,返回字串
        return str.substring(start,start+max).replaceAll("#","");
    }

好了今天这道开胃题就做完了。Yes!

你可能感兴趣的:(算法)