求最长回文子串
方法:中心法,回文最重要的是确定中心。
start即是中心,left和right就是回文的左右边界。
若start右边有重复字母,让right一直延长到无重复,start直接从那边开始
然后就是回文判断。
这样大约是O(n)
string longestPalindrome(string s)
{
int i,n,start,left,right,max_len;
string ans_s;
n=s.length();
if(n<2)
return s;
start=0; //中心最开始为0
max_len=0; //最长子串长度为0
while(start<n && n-start>max_len/2 ) //若剩余长度小于max_len/2,那么肯定不会再有结果,因为他们都是中心!
{
left=right=start;
while(right+1<n&&s[right+1]==s[start]) //右方延伸到无重复地带
right++;
start=right+1;//下次检索中心跳过重复字母,从那个地方开始
while(left-1>=0&&right+1<n) //若left-1和right+1都在范围内
if(s[left-1]==s[right+1]) //判断是否相等,相等则再向两边延伸,否则退出
{
left--;
right++;
}
else break;
if(right-left+1>max_len) //判断长度
{
max_len=right-left+1;
ans_s=s.substr(left,right-left+1);
}
}
return ans_s;
}