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)复杂度的代码……叫马拉车算法,很神奇。所以我就不贴我的代码了。