关闭

面试题 最长回文子串

59人阅读 评论(0) 收藏 举报
分类:

求最长回文子串


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

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:21697次
    • 积分:1783
    • 等级:
    • 排名:千里之外
    • 原创:164篇
    • 转载:2篇
    • 译文:0篇
    • 评论:2条
    最新评论