给定一个字符串 s,找到 s 中最长的回文子串。
示例 :
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
采用中心扩展法:
以字符串的每个字符为中心计算回文串最大长度,时间复杂度为O(n²)。
//判断s[i]为中心的回文串长度(奇数串和偶数串)
int expandAroundCenter(string s, int i, int j)
{
while (i >= 0 && j < s.size() && s[i] == s[j])
{
i--;
j++;
}
return (j - i - 1);
}
string longestPalindrome(string s)
{
if (s.size() < 2) return s;
int m_iMaxLen = 0;
int m_iBegin = 0;
int m_iEnd = 0;
//遍历s寻找以s[i]和s[i],s[i+1]为中心的回文串
for (int i = 0; i < s.size(); i++)
{
int m_iMaxLen_1 = expandAroundCenter(s, i, i); //判断奇数子串
int m_iMaxLen_2 = expandAroundCenter(s, i, i+1); //判断偶数子串
m_iMaxLen = max(m_iMaxLen_1, m_iMaxLen_2);
if (m_iMaxLen > m_iEnd - m_iBegin)
{
m_iBegin = i - (m_iMaxLen - 1) / 2;
m_iEnd = i + m_iMaxLen / 2;
}
}
return s.substr(m_iBegin, m_iEnd - m_iBegin + 1);
}