最长回文子串
题目:
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
解题思路:
该题分两次计算,一次计算长度为单数的最长子串,一次计算长度为双数的最长子串。
遍历字符串,计算以当前字符为中心的最长回文字串。以此类推,记录最长字串长度和中心点。
代码:
class Solution {
public:
string longestPalindrome(string s) {
int length = s.size();
if (length==0){
return "";
}
if(length==1){
return s;
}
int len1=0;
int start1=0;
int len2=0;
int start2=0;
string max_sub;
for(int i=0;i<length;i++){
int now_len=HW_len_1(s,i);
if(now_len>len1){
start1 =i;
len1=now_len;
}
}
for(int i=0;i<length-1;i++)
{
int now_len=HW_len_2(s,i,i+1);
if(len2<now_len)
{
len2=now_len;
start2=i;
}
}
if (len1>len2){
max_sub=s.substr(start1-len1/2,len1);
}
else{
max_sub=s.substr(start2-len2/2+1,len2);
}
return max_sub;
}
int HW_len_1(string s,int i){
int length = s.size();
int j=i+1;
i=i-1;
int max_len = 1;
while(i>=0 &&j<length){
if(s[i]==s[j])
{
max_len=max_len+2;
i--;
j++;
}
else{
return max_len;
}
}
return max_len;
}
int HW_len_2(string s,int i,int j){
int length = s.size();
int max_len=0;
while(i>=0 && j<length){
if(s[i]==s[j]){
max_len=max_len+2;
i--;
j++;
}
else{
return max_len;
}
}
return max_len;
}
bool isHW(string s){
int length = s.size();
for(int i=0;i<length/2;i++){
if(s[i]!=s[length-i-1]){
return false;
}
}
return true;
}
};