5. Longest Palindromic Substring 最长的回文子串

题目:Longest Palindromic Substring 最长的回文子串

难度:中等

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example 1:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Example 2:

Input: "cbbd"
Output: "bb"

题意解析:给定一个字符串s,在s中找出最长的回文子字符串。假设s的最大长度为1000。

回文:正反都一样的字符串,从左到右和从右到左相等

解题思路一:

从左边到右边依次遍历,以每一个元素作为回文字符串的中心点,将其向左右两边同时扩展,若左边等于右边,则到目前扩散的位置的字符串是回文,记录下此时的字符串,直至左边不等于右边,或者到达了字符串的边界位置,这是回文字符是奇数个的情况,若是偶数,则以当前元素和它的下一个元素为基点,向两侧进行扩散。其源代码如下。

public String longestPalindrome(String s) {
        if (s == null || s.length() < 1) return "";
        int len = s.length();
        int start = 0,max = 0, end = 0;
        for (int i = 0; i < len; i++) {
            int j = i - 1, k = i + 1;
            while (j >= 0 && k < len && s.charAt(j) == s.charAt(k)){
                if (k - j + 1 > max){
                    start = j;
                    max = k - j + 1;
                    end = k;
                }
                j--;
                k++;
            }
        }
        for (int i = 0; i < len; i++) {
            int j = i, k = i + 1;
            while (j >= 0 && k < len && s.charAt(j) == s.charAt(k)){
                if (k - j + 1 > max){
                    start = j;
                    max = k - j + 1;
                    end = k;
                }
                j--;
                k++;
            }
        }

        return s.substring(start, end+1);
    }

此算法内层进行两次变量,时间复杂度为O(2n²),去掉常数时间复杂度为O(n²)

提交代码之后:

Runtime: 24 ms, faster than 56.56% of Java online submissions for Longest Palindromic Substring.

Memory Usage: 37.7 MB, less than 87.97% of Java online submissions for Longest Palindromic Substring.

解题思路二:

在上一中方法中,奇偶不同时写了两遍的判断代码,其实我们完全可以将其合并到一起,写一次就行了,奇偶唯一不同的就是最中间的时候多一个数,当个数为奇数时,我们完全可以让当前元素与自己比较,然后再扩散,这样就只需写一次代码就够了。其源代码如下。

public String longestPalindrome(String s) {
        if (s == null || s.length() < 1) return "";
        int start = 0, end = 0;
        for (int i = 0; i < s.length(); i++) {
            int len1 = expandAroundCenter(s, i, i);
            int len2 = expandAroundCenter(s, i, i + 1);
            int len = Math.max(len1, len2);
            if (len > end - start) {
                start = i - (len - 1) / 2;
                end = i + len / 2;
            }
        }
        return s.substring(start, end + 1);
    }

    private int expandAroundCenter(String s, int left, int right) {
        int L = left, R = right;
        while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
            L--;
            R++;
        }
        return R - L - 1;
    }

此算法比上面的稍微优化了一点,时间复杂度还是O(n²)

提交代码之后:

Runtime: 9 ms, faster than 90.79% of Java online submissions for Longest Palindromic Substring.

Memory Usage: 37.8 MB, less than 83.26% of Java online submissions for Longest Palindromic Substring.

效率较上面提升了一大截

猜你喜欢

转载自blog.csdn.net/qq_21963133/article/details/88740400