原题链接:https://leetcode.cn/problems/longest-palindromic-substring/
难度:中
给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
提示:
回文子串即对称位置的值相等,判断是否为回文子串,需要注意两种情况
先分析字串长度为奇数的情况
奇数时相对容易,由于字符串长度为一时一定回文,因此,过程如下:
*LEFT
和*RIGHT
是否相等,并判断LEFT是否大于等于0,RIGHT要小于字符串长度-1
*LEFT
和*RIGHT
不相等,则统计此时回文子串的长度RIGHT-LEFT+1
统计字符串长度,因为此时指针指向的值不相等,此方法求出的长度比实际长度多2,因此应该用RIGHT-LEFT-1
统计字符串长度RIGHT-LEFT-1
大于MAX时,将当前值赋值给MAX,并创建一个字符串,将当前字串赋值给该字符串左图中的情况
*LEFT
等于*RIGHT
,指针向两侧移动,移动之后重复判断,不满足LEFT大于等于0的条件,循环终止,CENTER指向下一个位置,LENTH=3,MAX=3*LEFT
不等于*RIGHT
,CENTER后移,LENTH=1,MAX=3字串长度为偶数时
步骤与奇数时类似,难在如何高效地同时处理奇偶两种情况。
还应注意的是,最后的返回值类型要求是字符串:
(LEFT+RIGHT)/2=CENTER
,RIGHT-LEFT-1=MAX
根据这两个方程即可确定截取的原字符串位置LEFT=CENTER
,RIGHT=CENTER+1
,同样,通过解方程组,求出需要截取的字符串范围如果文字思路太抽象、看不懂,就多看几遍下面的代码
对于上面两种情况,可以发现,扩展部分的原理是相同的,我们可以将这一部分单独封装,重复使用
class Solution { public: int search(const string& s, int left, int right) { while (left >= 0 && right < s.size() && s[left] == s[right]) { left--; right++; } return right - left - 1; } string longestPalindrome(string s) { int mx(1); string result = s.substr(0, 1); for (int i = 0; i < s.size(); i++) { int sg = search(s, i - 1, i + 1); int db = search(s, i, i + 1); if (max(sg, db) > mx) { mx = max(sg, db); result = s.substr(i - (mx - 1) / 2, mx); } } return result; } };
运行效果
141 / 141 个通过测试用例
执行用时: 16 ms
内存消耗: 9.1 MB
当目前的最长回文子串长度超过剩余字符串长度的两倍时,在循环移动已无意义,因为接下来的子串长度一定不会超过目前的长度
代码实现
class Solution { public: int search(const string& s, int left, int right) { while (left >= 0 && right < s.size() && s[left] == s[right]) { left--; right++; } return right - left - 1; } string longestPalindrome(string s) { int mx(1); string result = s.substr(0, 1); for (int i = 0; i < s.size() - mx / 2; i++) { int sg = search(s, i - 1, i + 1); int db = search(s, i, i + 1); if (max(sg, db) > mx) { mx = max(sg, db); result = s.substr(i - (mx - 1) / 2, mx); } } return result; } };
运行效果
执行用时: 4 ms
内存消耗: 9.1 MB
这个题一共有如下几个重点:
对于第一点,举例假设的方法寻找规律
第二点,每轮循环求得最大值后,保留当前的最长字串
第三点,模拟一下
Copyright © 2023 leiyu.cn. All Rights Reserved. 磊宇云计算 版权所有 许可证编号:B1-20233142/B2-20230630 山东磊宇云计算有限公司 鲁ICP备2020045424号
磊宇云计算致力于以最 “绿色节能” 的方式,让每一位上云的客户成为全球绿色节能和降低碳排放的贡献者