LeedCode刷题笔记-最长回文子串
题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
ps:回文子串,就是一个字符串最常顺序书写和逆序书写,内容是一样的,如abba
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
解题代码
class Solution
{
public:
string longestPalindrome(string s)
{
//先对空字符串进行判断处理
if(s.length() < 1)
{
return " ";
}
//这里使用中心拓展法,分别重头对字符串每一个字符当作回文中心,对两边进行拓展判断
int start = 0, end = 0, len = 0, len1 = 0, len2 = 0, i = 0;
for(i = 0; i < s.length(); i++)
{
/* 传入i,i 就是求字符串个数为奇数时的最长子串长度 */
len1 = expend_around_center(s, i, i);
/* 传入i,i + 1 就是求字符串个数为偶数时的最长子串长度 */
/* 其实就是把偶长度的字符串中间两个字符看作一个整体中心 */
len2 = expend_around_center(s, i, i + 1);
len = max(len1, len2);
/* 每循环一次如果有更长的回文子串长度出现,则更新输出数据的start和end */
if(len > end - start)
{
/* 这里的数据为什么要-1,只需要带上面的实例字符串就可以推导得出了 */
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substr(start, end - start + 1);
}
/* 此函数用于求传入字符所能形成的最长回文子串长度 */
int expend_around_center(string &s, int L, int R)
{
while(L >= 0 && R <= s.length() && s[L] == s[R])
{
L--;
R++;
}
return R - L -1;
}
};
方法总结
- 使用的是中心拓展法,就是把字符串的每一个字符都当作回文子串的中心,向两边拓展,求出其能成立的最长回文子串长度;然后取所有单个字符作为回文子串中心时字符串长度的最大值。
- 最后把expend_around_center()的传参string s 改为了 string &s,程序运行的效率提升很大
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vTgt26qz-1610348848398)(https://i.loli.net/2021/01/11/SHbOtX3ez5mpZJg.png)]
所以,以后写代码可以注意一下传参问题,可以使用引用和指针传参的,就不必使用值拷贝传参了,很浪费时间和空间。