LeetCode 5. Longest Palindromic Substring(最长回文子串)

题目来源:https://leetcode.com/problems/longest-palindromic-substring/

问题描述

5. Longest Palindromic Substring

Medium

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"

------------------------------------------------------------

题意

求给定序列的最大回文子串。

------------------------------------------------------------

思路

分回文子串的长度为奇数和偶数两种情况讨论。枚举回文子串的中间位置(对于奇数长度串来说就是最中间那个字符的位置,对偶数长度串来说就是中间偏左的那个字符的位置),对每个中间位置,枚举回文子串左右的偏移量。复杂度为O(n^2).

------------------------------------------------------------

代码

class Solution {
    public String longestPalindrome(String s) {
        int mid = 0, bias = 0, n = s.length(), max_bias, m_mid = 0, m_bias = 0, len, max_len = 0;
        boolean odd = true;
        // mid: substring mid point pointer
        // bias: substring bias pointer wrt. mid
        // n: string length
        // max_bias: max reachable bias wrt. mid
        // m_mid: mid point for max substring found
        // m_bias: bias for max substring found
        // len: substring length
        // max_len: current max substring length
        // odd: true - max substring length is odd; false - max substring length is even
        
        if (n == 0)         // s == ""
        {
            return s;
        }
        
        // enumerate odd length substring
        for (mid=0; mid<n; mid++)
        {
            len = 1;
            max_bias = Math.min(mid, n-1-mid);          // max reachable bias wrt. mid
            for (bias = 1; bias <= max_bias; bias++)
            {
                if (s.charAt(mid-bias) == s.charAt(mid+bias))
                {
                    len += 2;
                }
                else
                {
                    break;
                }
            }
            if (len > max_len)
            {
                max_len = len;
                m_mid = mid;
                m_bias = --bias;
            }
        }
        // enumerate even length substring
        for (mid=0; mid<n; mid++)
        {
            len = 0;
            max_bias = Math.min(mid, n-2-mid);          // max reachable bias wrt. mid
            for (bias = 0; bias <= max_bias; bias++)
            {
                if (s.charAt(mid-bias) == s.charAt(mid+bias+1))
                {
                    len += 2;
                }
                else
                {
                    break;
                }
            }
            if (len > max_len)
            {
                max_len = len;
                m_mid = mid;
                m_bias = --bias;
                odd = false;
            }
        }
        
        // System.out.println(String.valueOf(m_mid) + " " + String.valueOf(m_bias));
        if (odd)
        {
            return s.substring(m_mid-m_bias, m_mid+m_bias+1);
        }
        else
        {
            return s.substring(m_mid-m_bias, m_mid+m_bias+2);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/da_kao_la/article/details/87871211