leetcode hot 100
最长回文子串
-
题目描述;
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:输入: “cbbd”
输出: “bb”来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 -
暴力解法:
def longestPalindrome(s):
max_length = len(s)
if (max_length == 0):
return ""
# print(max_length)
while (max_length >= 1):
for i in range(len(s)):
right = i + max_length - 1
if (right < len(s)):
if (i == right):
newstr = s[i]
else:
newstr = s[i:right+1]
# print(newstr)
if (IsPalindrome(newstr)):
return newstr
else:
break
max_length -= 1
return None
def IsPalindrome(str): # 用来判断一个字符串是否为回文子串
length = len(str)
left = 0
right = length - 1
while (left < right):
if (str[left] == str[right]):
left += 1
right -= 1
else:
return False
return True
- 中心展开法
def longestPalindrome(s):
if(len(s) < 1):
return ""
start, end = 0, 0 # 用来记录当前最长回文子串的开始和结尾坐标
for i in range(len(s)):
len1 = expend(s, i , i) # 用来计算中心为一个字母时的最长回文串,返回长度
len2 = expend(s, i, i+1) # 用来计算中心为两个字母时的最长回文串,返回长度
lenf = max(len1,len2) # 用来存储当前最长回文串的长度
print(lenf)
if(lenf > end-start+1):
if lenf%2 != 0:
start = int(i - (lenf-1)/2)
end = int(i + (lenf-1)/2 )
else:
start = int(i - lenf/2 +1)
end = int(i + lenf/2 )
print(start,end)
return s[start:end+1]
def expend(s, left, right): # 计算字符串在中心确定时的最长回文串长度
l, r = left, right
while(l>=0 and r < len(s) and s[l]==s[r]):
l -=1
r +=1
return r-l-1
‘’’事实上,只需使用恒定的空间,我们就可以在 O(n^2)O(n 2 ) 的时间内解决这个问题。
我们观察到回文中心的两侧互为镜像。因此,回文可以从它的中心展开,并且只有 2n - 12n−1 个这样的中心。
你可能会问,为什么会是 2n - 12n−1 个,而不是 nn 个中心?原因在于所含字母数为偶数的回文的中心可以处于两字母之间(例如 \textrm{“abba”}“abba” 的中心在两个 \textrm{‘b’}‘b’ 之间)
作者:LeetCode
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zui-chang-hui-wen-zi-chuan-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。‘’’
个人理解: 其实中心展开法就是不断的去确定中心,然后根据中心去找以该中心为中心的最长回文子串,同时计算出此回文子串的长度lenf,如果长度比之前寻找到的长度(end-start)更长,那么就更新这个lenf值,并且记录下当前最长字串的开始位置和结束位置,即start和end,然后循环。直到遍历完所有的中心。
中心:
- 什么是中心
例如:‘abcb’那么 a,b,c,d都可能是一个回文子串的中心,但是我们注意到,有时候中心可能为两个字母,例如回文子串‘abba’,中心即为‘bb’。所以,‘abcb’我们需要遍历的所有中心应该是[a,b,c,b,ab,bc,cb] 等同于[a,ab,b,bc,c,cb,b]