Description
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
这个题是比较基础的题目,有很多中方法,个人觉得简单的就是暴力法跟中心扩展法,但是暴力在leetcode上面智能过41个case。所以这里我主要介绍下中心扩展的方法。
例如一个字符串s="abbbabba"
那么他的中心无非有两种,一种是基数性质的,比如这个字符串里面的bab,a就是一个中心,第二中就是偶数为中心的,比如‘bb’这种的,由这两种格式的中心向两侧进行扩展,那哪一个扩展出来的子串的长度长长,极为最长的回文子串(最长回文子串是中心对称的),所以这样即可得出结果,下面是主要的c++代码
class Solution
{
public:
string longestPalindrome(string s)
{
//判断空字符串的情况
if (s == "")
{
return "";
}
string result("");
int sSize = int(s.size());
//选择一个中心点,向两侧扩展
for (int i = 0; i < sSize; i++)
{
//奇数组情况
string tmpStr = expandHelper(s, i, i);
//偶数组情况
string tmpStr2 = expandHelper(s, i, i + 1);
if (int(tmpStr.size()) > int(result.size()))
{
result = tmpStr;
}
if (int(tmpStr2.size()) > int(result.size()))
{
result = tmpStr2;
}
}
return result;
}
string expandHelper(string &s, int left, int right)
{
int sSize = int(s.size());
while (left >= 0 && right < sSize && s[left] == s[right])
{
left--;
right++;
}
//小心s[left] != s[right]
return (s.substr(left + 1, right - left - 1));
}
};
网友评论