【刷题笔记】——day.3 最长回文子串

学习目标:

用于记录每日刷的题目为了明年的python组蓝桥杯做准备,今天是打卡的第三天,冲!

【刷题笔记】——day.3 最长回文子串_第1张图片


 原题:最长回文子串

题目描述:

给你一个字符串 s,找到 s 中一个最长的回文子串。

示例一: 

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例二:

输入:s = "cbbd"
输出:"bb"

示例三: 

输入:s = "a"
输出:"a"


 题解:

思路一(双指针扩散法):

1.首先我们知道一个回文子串肯定是中心对称的,那么我们的思路就是选定一个字符为中心然后向这个字符的两边扩散。如果两边的字符相等,那么一定还是一个回文子串,直到出现两边的字符不相等,返回此时的回文子串

2.以一个字符为中心扩散只能找到奇数长度的回文子串,所以我们还要去查找以偶数长度的子串。如果出现两个相等的连续字符,我们以这两个字符为中心向两边查找,直到两边的字符不相等返回。

3.依此遍历整个字符串即可找到最大的子回文串。

代码实现(Python) :

def longestPalindrome(s):
    order =[0,0]   #用于储存最长回文子序列的下标
    for i in range(len(s)-1):   
        l = i-1 ;r = i+1 ; index = [i,i]   #查找奇数长度的回文串
        while l >= 0 and r <= len(s)-1:
            if s[l] == s[r]:
                index[0],index[1] = l,r
            else:
                break
            l -= 1
            r += 1
        if index[1] - index[0] > order[1] - order[0]:   #刷新最大值
            order[1],order[0] = index[1],index[0]

        l = i; r = i+1     #查找偶数长度的回文串
        if s[l] == s[r]:
            index = [l,r]
            while l >= 0 and r <= len(s)-1:
                if s[l] == s[r]:
                    index[0],index[1] = l,r
                else:
                    break
                l -= 1
                r += 1
            if index[1] - index[0] > order[1] - order[0]:   #刷新最大值
                order[1],order[0] = index[1],index[0]
    return s[order[0]:order[1]+1]    #最后返回最长的子回文串

C语言版:

#include 
#include 
int main()
{
	int order1=0,order2=0,i,len,l,r,index1,index2;
	char s[100];
	gets(s);   //获取字符串
	len = strlen(s);  //获取字符串长度
	for(i=0;i=0 && r<=len-1)
		{
			if(s[l]==s[r])
			{
				index1=l;index2=r;
			}
			else
			{
				break;
			}
			l -= 1;r += 1;
		}
		if((index2-index1)>(order2-order1))   //刷新最长子回文串的下标
		{
			order1 = index1;order2 = index2;
		}

		l=i;r=i+1;
		if(s[l]==s[r])
		{
			l=l-1;r=r-1;index1=l;index2=r;   //查找偶数长度的最大子回文串
			while(l>=0 && r<=len-1)
			{
				if(s[l]==s[r])
				{
					index1=l;index2=r;
				}
				else
				{
					break;
				}
				l -= 1;r += 1;
			}
			if((index2-index1)>(order2-order1))    //刷新最长子回文串的下标
			{
				order1 = index1;order2 = index2;
			}
		}
	}
	for(i=order1;i<=order2;i++)   //打印最长子回文串
	{
		printf("%c",s[i]);
	}
	printf("\n");
}

你可能感兴趣的:(蓝桥杯,算法,职场和发展)