【算法】【字符串】最长回文子串

1  题目

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

2  解答

唉,超时了,待我后续想想:

class Solution {
    public String longestPalindrome(String s) {
        // 1 <= s.length <= 1000 无需校验参数 null
        // 先采用暴力
        int len = s.length();
        String res = "";
        for (int i = 0; i < len; i++) {
            int left = 0, right = len - 1;
            String subRes = "";
            // 左边
            for (int j = 0; j <= i; j++) {
                String leftSub = s.substring(j, i + 1);
                if (leftSub.equals(new StringBuilder(leftSub).reverse().toString()) && leftSub.length() > res.length()) {
                    res = leftSub;
                    break;
                }
            }
            // 右边
            for (int j = len - 1; j >= i; j--) {
                String rightSub = s.substring(i, j + 1);
                if (rightSub.equals(new StringBuilder(rightSub).reverse().toString()) && rightSub.length() > res.length()) {
                    res = rightSub;
                    break;
                }
            }
            // 取两边最短的
            int subLen = Math.min(i - left, right - i);
            int j = 1;
            while (subLen > 0 && j <= subLen) {
                left = i - j;
                right = i + j;
                if (s.charAt(left) == s.charAt(right)) {
                    subRes = s.substring(left, right + 1);
                    j++;
                    continue;
                }
                break;
            }
            if (subRes.length() > res.length()) {
                res = subRes;
            }
            if (subRes.length() == s.length()) {
                return subRes;
            }
        }
        return res;
    }
}

加油。

posted @ 2024-01-24 07:51  酷酷-  阅读(1)  评论(0编辑  收藏  举报