最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。
回文子串:如果字符串向前和向后读都相同,则它满足回文性。
如图:
使用中心扩展法来解决最长回文子串问题
中心扩展法是一种寻找最长回文子串的算法,其核心思想是从一个中心点向两边扩展,直到不能形成回文为止。
初始化左右指针:以当前字符s[i]为中心,初始化左右指针l和r都指向i。
向左边扩展:
使用while循环,当左边界l-1大于等于0(即左边界在字符串范围内)且s[l-1]等于s[l](即当前字符与左边界字符相同)时,将左边界l向左移动一位,即l–。
向右边扩展:
使用另一个while循环,当右边界r+1小于等于字符串长度减1(即右边界在字符串范围内)且s[r+1]等于s[r](即当前字符与右边界字符相同)时,将右边界r向右移动一位,即r++。
同时向两边扩展:
再次使用while循环,这次同时检查左右边界:
左边界l-1大于等于0,右边界r+1小于等于字符串长度减1,确保扩展在字符串范围内。
s[l-1]等于s[r+1],确保以s[i]为中心的两侧字符相同,形成回文。
当满足上述条件时,同时将左边界l向左移动一位和右边界r向右移动一位,即l–和r++。
更新最长回文子串:如果当前扩展得到的回文子串长度r-l+1大于之前记录的最长长度res,则更新res,并记录当前回文子串的起始和结束索引bl和br。
代码如下:
class Solution {
public:
string longestPalindrome(string s) {
int len=s.size();
if(len==1) return s;
int res=0;
int be=0;
string result;
int br,bl;
for(int i=0;i<s.size();i++)
{
int r=i;
int l=i;
while(l-1>=0 && s[l-1]==s[l])
{
l--;
}
while(r+1<=s.size()-1 && s[r+1]==s[r])
{
r++;
}
while(l-1>=0 && r+1<=s.size()-1 && s[l-1]==s[r+1])
{
l--;
r++;
}
if(r-l+1>res) //更新结果
{
res=r-l+1;
br=r; //记录位置
bl=l;
}
}
string t=s.substr(bl,br-bl+1);
return t;
}
};