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

Posted 澄某人呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题笔记——day.3 最长回文子串相关的知识,希望对你有一定的参考价值。

学习目标:

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


 原题:最长回文子串

题目描述:

给你一个字符串 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 <stdio.h>
#include <string.h>
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<len-1;i++)
	
		l=i-1;r=i+1;index1=i;index2=i;   //查找奇数长度的最大子回文串
		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;
		

		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");

以上是关于刷题笔记——day.3 最长回文子串的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题8——最长回文子串

刷题日记最长回文子串

刷题日记最长回文子串

刷题日记最长回文子串

力扣刷题:最长回文子串(java实现)

Leetcode刷题Python5. 最长回文子串