给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
暴力超时法
class Solution {
public:
string longestPalindrome(string s) {
int length = 0;
string res;
for(int i = 0; i<s.size(); i++){
// dp = dp + 1;
int left = i;
for(int j = left; j>=0; j--){
if(isHuiwen(s.substr(j, i - j + 1))){
// dp = dp + 1;
if(i - j + 1 > length){
res = s.substr(j, i - j + 1);
length = max(length, i - j + 1);
}
}
}
// cout<<i<<" "<<dp<<endl;
}
return res;
}
bool isHuiwen(string s){
int left = 0;
int right = s.size() - 1;
while(left< right){
if(s[left] != s[right]){
return false;
}
left++;
right--;
}
return true;
}
};
中心扩展法
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size(), ans = 0;
int length = 0 ;
string res;
for (int i = 0; i < 2 * n - 1; ++i) {
int l = i / 2, r = i / 2 + i % 2;
bool flag = true;
while (l >= 0 && r < n && s[l] == s[r]) {
--l;
++r;
++ans;
}
cout<<"l "<<l<<endl;
if(length < r - l - 1){
res = s.substr(l + 1, r - l - 1);
length = r -l -1;
}
}
return res;
}
};