题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba"也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
代码
class Solution {
public:
string longestPalindrome(string s) {
int stepEven=0;
int stepOdd=0;
int max=0;
int isOdd=false;
int pos=0;
for(int i=0;i<s.length();i++)
{
//奇数
for(int step=0;(i-step>=0)&&(i+step<s.length());step++)
{
if(s[i-step]!=s[i+step])
break;
stepOdd=step*2+1;
}
if(stepOdd>max)
{
max=stepOdd;
isOdd=true;
pos=i;
}
//偶数
for(int step=1;(i-step+1>=0)&&(i+step<s.length());step++)
{
if(s[i-step+1]!=s[i+step])
break;
stepEven=step*2;
}
if(stepEven>max)
{
max=stepEven;
isOdd=false;
pos=i;
}
}
string result;
if(isOdd)
{
result=s.substr(pos-(max-1)/2,max);
}
else
{
result=s.substr(pos-max/2+1,max);
}
return result;
}
};
思路
采用中心扩展法,一共要考虑两种情况:第一种就是回文字符串长度为奇数,从最中间的那个字符开始比较的话是比较它左右的字符串,比如"11322"
,从3开始比较;第二种就是回文字符串长度为偶数,如果是"2112"
的话,那么最开始比较的是第一个1
;比较完后返回字符串的时候要分别考虑奇偶来切分子串。