LeetCode05 最长回文子串

暴力解法

public String longestPalindrome(String s) {
        int max = 0;
        int start = 0;
        int n = s.length();
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                if (isReverseStr(s.substring(i, j + 1))) {
                    if (j - i + 1 > max) {
                        max = j - i + 1;
                        start = i;
                    }
                }
            }
        }
        return s.substring(start, start + max);
    }

    public boolean isReverseStr(String str) {
        if (str == null) {
            return true;
        }
        if (str.isEmpty()) {
            return true;
        }
        int n = str.length();
        int mid = n >> 1;
        for (int i = 0; i <= mid; i++) {
            if (str.charAt(i) != str.charAt(n - 1 - i)) {
                return false;
            }
        }
        return true;
    }

动态规划

对于一个子串而言,如果它是回文串,并且长度大于
2
2,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串
“ababa”
“ababa”,如果我们已经知道
“bab”
“bab” 是回文串,那么
“ababa”
“ababa” 一定是回文串

中心扩散法

每一个回文串都有自己的中心,遍历每一个可能的中心,逐渐向两边扩散

    public String longestPalindrome(String s) {
        int max = 0;
        int mid = 0;
        int n = s.length();
        for (int i = 0; i < n; i++) {
            int len1 = maxPalindrome(s, i, i);
            int len2 = maxPalindrome(s, i, i + 1);
            if (len1 > max || len2 > max) {
                max = len1 > len2 ? len1 : len2;
                mid = i;
            }
        }
        return s.substring(mid - (max - 1) / 2, mid + max / 2 + 1);
    }

    public int maxPalindrome(String s, int left, int right) {
        int n = s.length();
        while (left >= 0 && right < n && s.charAt(left) == s.charAt(right)) {
            left--;
            right++;
        }
        return right - left - 1;
    }
posted @ 2023-02-15 16:52  jrjewljs  阅读(15)  评论(0编辑  收藏  举报