面试题 最长回文子串

求最长回文子串


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

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;
 }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值