LeetCode 5. 最长回文子串——中心扩展法彻底讲透
LeetCode 5. 最长回文子串——中心扩展法彻底讲透一、题目描述给定一个字符串s找到其中最长的回文子串并返回这个子串。示例输入s babad 输出bab 解释aba 同样是符合题意的答案。输入s cbbd 输出bb二、什么是回文串回文串Palindrome正着读和反着读完全一样的字符串。例如a aa aba abba racecar都属于回文串。而ab abc abca不是回文串。三、回文的核心性质左右对称所有回文串一定存在一个「对称中心」。例如奇数长度回文aba a ← b → a中心是b偶数长度回文abba ab ← → ba中心是两个字符之间的缝隙因此只要找到所有可能的对称中心然后不断向两边扩散就能找到所有回文串。这就是中心扩展法。四、整体思路对于字符串中的每一个位置i我们都尝试两种情况情况1奇数回文expand(i,i)例如aba ^情况2偶数回文expand(i,i1)例如abba ^^每次扩散结束后记录当前回文的长度。如果比之前最长的回文还长就更新答案。五、扩散函数怎么写定义函数expand(left,right)表示从left和right开始向两边扩散。扩散条件三个条件必须同时满足left0rightlen(s)s[left]s[right]满足条件left-1right1继续扩散。为什么最后要回退例如aba扩散过程left1 right1 ↓ left0 right2 ↓ left-1 right3退出循环时left-1 right3已经越界了。真正有效的边界应该是0 ~ 2因此返回left1right-1六、完整代码classSolution:deflongestPalindrome(self,s:str)-str:# 长度小于2直接返回iflen(s)2:returns start0end0defexpand(left,right):while(left0andrightlen(s)ands[left]s[right]):left-1right1returnleft1,right-1foriinrange(len(s)):# 奇数长度回文l1,r1expand(i,i)# 偶数长度回文l2,r2expand(i,i1)# 更新最长奇数回文ifr1-l1end-start:startl1 endr1# 更新最长偶数回文ifr2-l2end-start:startl2 endr2returns[start:end1]七、拿示例跑一遍字符串s babadi 0奇数b长度1偶数无最长bi 1奇数bab长度3更新答案bab偶数无i 2奇数aba长度3和当前最长相同。保持bab最终返回bab八、为什么i 1不会越界假设s abc最后一次i2expand(2,3)进入函数rightlen(s)即33不成立。直接退出。不会报错。九、复杂度分析时间复杂度O(n²)共有2n 个中心每个中心最多扩散O(n)因此O(n²)空间复杂度O(1)只使用有限几个变量。十、高频易错点1、只处理奇数回文错误expand(i,i)遗漏expand(i,i1)会导致cbbd输出错误。2、扩散使用 if错误ifs[left]s[right]:只能扩一层。必须使用while持续扩散。3、忘记回退边界错误returnleft,right应该returnleft1,right-14、长度公式少写 1错误right-left正确right-left15、字符串切片忘记1错误s[start:end]正确s[start:end1]因为 Python 切片左闭右开十一、一句话总结最长回文子串的核心思想枚举每一个可能的回文中心从中心向两边不断扩散记录最长回文的左右边界。记忆口诀一个字符找奇数 两个字符找偶数 左右不断往外扩 记录最长回文串。