给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
暴力破解法--运行超时
class Solution
{
public:
string longestPalindrome(string s)
{
string result("");//初始化输出字符串;
int s_size = s.size();
for(int i = 0; i <s_size;i++){
int cut_maxsize =s_size-i;
for(int cut_size = 1;cut_size<=cut_maxsize;cut_size++){
string str = s.substr(i,cut_size);
if(isPalindrome(str)&&str.size()>result.size())result=str;
}
}
return result;
}
bool isPalindrome(string str){
int l = 0;
int r = str.size()-1;
for(;l<r;l++,r--)
if(str[l]!=str[r])return false;
return true;
}
};
中心扩展法
class Solution {
public:
string judge(string& s,int l,int r)
{
while(l>=0&&r<s.size()&&s[l]==s[r])
{
l--;
r++;
}
return s.substr(l+1,r-l-1); //回文串的实际起始地址为l+1,回文长度为 (r-1)-(l+1)+1= r+l-1
}
string longestPalindrome(string s) {
string res;
for(int i=0;i<s.size();i++)//从第一个字符开始遍历
{
string res1=judge(s,i,i);//奇 设该回文串为奇数中心符,沿该中心符左右展开判断,返回以该字符为中心的最大回文字符
string res2=judge(s,i,i+1);//偶 该回文串为偶数中心符,沿该对中心符左右展开判断,返回以该对字符为中心的最大回文字符
//从该字符的奇偶中心回文串中选择出最大串
res=res.size()>res1.size()?res:res1;
res=res.size()>res2.size()?res:res2;
}
return res;
}
};