- 题目描述:最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- C++编程实现:
- 中心扩展法
class Solution {
public:
string longestPalindrome(string s) {
int len=s.size();
if(len==0||len==1)
return s;
int start=0;//记录回文子串起始位置
int end=0;//记录回文子串终止位置
int mlen=0;//记录最大回文子串的长度
for(int i=0;i<len;i++)
{
int len1=expendaroundcenter(s,i,i);//一个元素为中心
int len2=expendaroundcenter(s,i,i+1);//两个元素为中心
mlen=max(max(len1,len2),mlen);
if(mlen>end-start+1)
{
start=i-(mlen-1)/2;
end=i+mlen/2;
}
}
return s.substr(start,mlen);
//该函数的意思是获取从start开始长度为mlen长度的字符串
}
private: int expendaroundcenter(string s,int left,int right)
//计算以left和right为中心的回文串长度
{
int L=left;
int R=right;
while(L>=0 && R<s.length() && s[R]==s[L])
{
L--;
R++;
}
return R-L-1;
}
};
作者:chenlele
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-c-by-gpe3dbjds1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:
string longestPalindrome(string s) {
if (s.size() == 0 || s.size() == 1)
return s;
//Insert ‘#’
string t = "$#";
for (int i=0; i<s.size(); ++i)
{
t += s[i];
t += "#";
}
//Process t
vector<int> p(t.size(),0);
int mx=0, id=0, resLen=0, resCenter=0;
for (int i=1; i<t.size(); ++i)
{
p[i] = mx>i?min(p[2*id-i],mx-i):1;
if (i+p[i] >= t.size())
break;
while (t[i+p[i]] == t[i-p[i]])
{
++p[i];
if (i+p[i] >= t.size())
break;
}
if (mx < i+p[i])
{
mx = i+p[i];
id = i;
}
if (resLen <= p[i] && p[i] > 2)
{
resLen = p[i];
resCenter = i;
}
}
return s.substr((resCenter-resLen)/2, resLen-1);
}
};
重点笔记:
bob ——> #b#o#b# ——> $#b#o#b# {中心点(o)的位置是4,半径为4,回文长度为3}
noon ——> #n#o#o#n# ——> $#n#o#o#n# {中心点(#)的位置是5,半径是5,回文长度为4}
122122 ——> #1#2#2#1#2#2# ——> $#1#2#2#1#2#2# {中心点(1)的位置是8,半径是6,回文长度为5}
则回文的起始位置为:中心点减去半径再除以2;
则回文的终点位置为:半径减去1.