5. 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
思路:中心对称法则
选定中心点,往两边进行拓展即可
代码
class Solution {
public:
string longestPalindrome(string s) {
if(s.length() < 2)
{
return s;
}
int start = 0,Max = 0;
int len;
for(int i = 0;i < s.length()-1;i++)
{
int len1 = Cal(s,i,i);
int len2 = Cal(s,i,i+1);
len = max(len1,len2);
if(len > Max)
{
start = i - (len - 1)/2;
Max = len;
}
}
return s.substr(start,Max);
}
int Cal(string s,int l,int r)
{
while(l >= 0 && r < s.length() && s[l] == s[r])
{
l--;r++;
}
r--;l++; //回到满足条件的上一层
return r-l+1;
}
};
然而,执行用时:124ms,占用空间:104 MB……
不用函数的代码
class Solution {
public:
string longestPalindrome(string s) {
if(s.length() < 2)
{
return s;
}
int start = 0,Max = 0;
for(int i = 0;i < s.length()-1;i++)
{
int l = i;
int r = i;
while(l >= 0 && r < s.length() && s[l] == s[r])
{
l--;r++;
}
if(r-l-1 > Max)
{
start = i - (len - 1)/2;
Max = r-l-1;
}
l = i;
r = i + 1;
while(l >= 0 && r < s.length() && s[l] == s[r])
{
l--;r++;
}
if(r-l-1 > Max)
{
start = i - (len - 1)/2;
Max = r-l-1;
}
}
return s.substr(start,Max);
}
};
不用函数以后,执行用时:28ms,占用空间:8.9M……