首先想到的就是最笨的方法,暴力搜索,但是好像通过不了,超出时间限制,看了别人的代码,才知道大神真的是太多太多。
class Solution {
public:
string longestPalindrome(string s) {
string res="";//存放结果
string temp="";//存放子串
for(int i=0;i<s.length();i++)
{
for(int j=i;j<s.length();j++)
{
temp=temp+s[j];
string tem=temp;//tem存放子串反转结果
std::reverse(tem.begin(),tem.end());//反转
if(temp==tem)
res=res.length()>temp.length()?res:temp;
}
temp="";
}
return res;
}
};
对于一个回文串,它有一个中心,该中心可以为一个字符,也可以只是两个字符之间的间隙。
找到中心后向左右同时进行扩展,并且左右两边的字符应该对应相等。
对于该题我们可以从字符串的左边第一个字符开始,首先以第一个字符作为中心,求出对应回文串的长度len1,再以它右边的间隙为中心,求出对应回文串的长度len2,以此类推知道遍历完整个数组为止,便可得到最长的回文子串了。
`
class Solution {
public:
string longestPalindrome(string s) {
if (s.length() <= 1)
return s;
int maxLen = 1, start = 0;
for (int i = 0; i < s.length(); i++) {
int len = lenOfPalindrome(s, i);
if (len > maxLen) {
maxLen = len;
start = i - (maxLen - 1) / 2;
}
}
return s.substr(start, maxLen);
}
int lenOfPalindrome(string& s, int c) {
int l, r;
int len1, len2;
for (l = c, r = c; l >= 0 && r < s.size() && s[l] == s[r]; l--, r++);
len1 = r - l - 1;
for (l = c, r = c+1; l >= 0 && r < s.size() && s[l] == s[r]; l--, r++);
len2 = r - l - 1;
return max(len1, len2);
}
};
`
作者:huwt
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-zhan-fa-by-huwt/