题目来源: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);
}
}
}