您的位置:首页 > 职场人生

面试题 最长回文子串

2016-08-30 14:45 197 查看
求最长回文子串

方法:中心法,回文最重要的是确定中心。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: