【LeetCode】5.最长回文子串

5.最长回文子串

一、问题描述

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

二、问题简化

所谓回文字符串,即反过来念的字符串和正着念一样。比如“卿卿我我卿卿”、“一二三二一”、“12321”。

回文一词指的是汉语的一种语法,英文为palindrome

问题可以拓展到任意类型,并且并不一定返回最长的(何况最长的可能不只一个)。

虽然单个元素也是对称的,但是返回它并没有意义,所以我们只返回长度大于1的回文子串。

三、功能实现

1.遍历所有子串(从长到短,也可以反过来,看问题需求是返回最长还是最短)

2.判断子串是否满足回文要求(这一个功能可以单独作为一个算法)

3.满足要求的加入到返回值

判断子串是否满足回文要求:

//判断子串是否为回文子串
template<typename T>
bool IsPalindrome(const T& vec, int beg, int len)
{
	if (len <= 1)
		return true;

	int last = beg + len - 1;
	while (beg < last)
	{
		if (vec[beg] != vec[last])
			return false;
		++beg;
		--last;
	}
	return true;
}

遍历所有子串,从长到短(不包含长度为1的):

template<typename T>
vector<T> GetSubPalindrome(const T& vec)
{
	vector<T> ret;

	int length = vec.size();
	for (int len = length; len > 1; --len)
	{
		for (int beg = 0; beg + len < length; ++beg)
		{
			if (IsPalindrome(vec, beg, len))
			{
				ret.emplace_back(vec.begin() + beg, vec.begin() + beg + len);
			}
		}
	}
	return ret;
}

 四、测试结果

我的代码是最简单的暴力算法,是O(N^3)的时间复杂度,竟然有O(N)复杂度的代码……叫马拉车算法,很神奇。所以我就不贴我的代码了。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值