0%

Leetcode 005 Longest Palindromic Substring

题目要求

输入字符串 s 要求返回其中包含的长度最长的回文子字符串

思路:

朴素解法亦暴力解法即遍历所有子字符串,找到最长的回文字符串,效率低,不可取

优化:

  • 验证回文字符串时不需要检验整个字符串,只需从两边向中间,发现不一样的字母即可判断不是回文;
  • 因为只需返回最长的回文字符串,因此比当前最长回文字符串短的字符串均不需检验;
  • 需要考虑长度为奇数/偶数的回文检验。

程序总体思路为:从左至右循环,每次检验到第 i 个字符为止的比当前最长回文字符串长度多 1 和 2 的字符串,如果是回文就更新当前最长回文及其长度,最后返回结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
if s is None or s == "":
return ""
if len(s) < 2:
return s

currLen = 0
currStr = ""
for i in range(len(s)):
if self.isPalindrome(s, i - currLen - 1, i):
currStr = s[i - currLen - 1 : i + 1]
currLen += 2
elif self.isPalindrome(s, i - currLen, i):
currStr = s[i - currLen : i + 1]
currLen += 1

return currStr

def isPalindrome(self, s, begin, end):
if begin < 0:
return False

while begin < end:
if s[begin] != s[end]:
return False
else:
begin, end = begin + 1, end - 1

return True