力扣练习第三天——最长回文子串

力扣练习第三天——最长回文子串

今天练习的题目是最长回文字串,题目大意如下
给定一个字符串s,找到s中的最长的回文子串,可以假设s的最大长度为1000

试题来源于LeetCode——最长回文子串:https://leetcode-cn.com/problems/longest-palindromic-substring/

示例一:
输入:“ababd” 输出:“bab” ("aba"也是一个有效答案)

示例二:
输入:“cbbd” 输出:“bb”

该题目曾在黑书中也出现过,题目大致相同,稍微有点区别的是黑书中要求输出的是该回文子串的最大长度是多少。不过,只要已经找到回文子串的长度,再加上子串的起始位置,用上substr函数就可以将该子串表达出来。

大致思路:

  1. 最开始想到的是直接遍历去搜索,从左到右不断缩小取的空间,然后在这部分空间内,又从左到右去取得子串,在利用反转函数将反转后的子串与原先的子串对比,如果相等,则迭代掉之前的最长回文子串。但很显然,这样的方法有点慢。
  2. 另外就是在黑书上面看到的中心扩展的办法,写一个函数,以指定元素为中心,向两边扩展,看看能扩展的最大长度是多少。这样对比下来,可以加快找到最长回文子串的速度(减少了不必要的循环)。不过在这里,要区别对待奇数与偶数个的子串,具体就是在确定中心时:奇数的中心L=R,偶数的中心L+1=R。通过这样方式,找到最长回文子串的长度。并且在这个过程中,记录下起始位置。最后返回时,使用s.substr(a,m_len)
  3. 看了看题解区,还有动态规划的方法,但是没怎么研究过,等会可以再单独研究一下代码。另外也有Manacher的办法也十分的巧妙,能够不需要处理奇数与偶数的问题。
class Solution:
public:
string longestPalindrome(string s){
int len=s.size();
	if(len==0||len==1)
		return s;
	int a=0;int b=0;int m_len=0;
	for(int i=0;i<len;++)
	{
		int len1=countcenter(s,i,i);
		int len2=countcenter(s,i,i+1);
		m_len=max(max(len1,len2),m_len);
		if(m_len>b-a+1){
			a=i-(m_len-1)/2;
			b=i+m_len/2;
		}
	}
	return s.substr(a,m_len);

private:
int countcenter(string s,int L,int R)
{
	while(L>=0&&R<s.length()&&s[R]==s[L]){
		L--;R++;
	}
}	
};

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值