您的位置:首页 > 其它

LeetCode每日一题——T5. 最长回文子串(中):中心扩散法、未完待续

2019-07-01 16:14 387 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_41514090/article/details/94395731

法一、中心扩散法:以字符串某元素(奇数扩散中心,对应子串长度为奇数)或某两相同元素中间(偶数扩散中心,对应子串长度为偶数)为中心,分别向两端扩散,如果两端元素相同,则继续扩散,不相同则退出,保留当前子串;更换中心元素,直至找到最长回文子串。

class Solution:
def longestPalindrome(self, s: str) -> str:
s_len = len(s)
if s_len == 0:
return ''
_palindrome_len = 1
_palindrome_str = s[0]

for i in range(s_len):
palindrome_odd, odd_len = self._center_spread(s, s_len, i, i)
palindrome_even, even_len = self._center_spread(s, s_len, i, i+1)
# 调用函数,分别以s[i](子串长度为奇数)、s[i]和s[i+1]的中间(长度为偶数)为中心进行扩散,寻找最长回文子串

cur_max_str = palindrome_odd if odd_len > even_len else palindrome_even
if len(cur_max_str) > _palindrome_len:
_palindrome_len = len(cur_max_str)
_palindrome_str = cur_max_str

return _palindrome_str

def _center_spread(self, s , s_len, left, right):		# 定义寻找最长回文子串函数
l = left
r = right
while l >= 0 and r < s_len and s[l] == s[r]:
l -= 1
r += 1
return s[l+1 : r], r - l - 1    # 注意此处s[l+1 : r]是输出s[l+1], s[l+2], ... s[r-1]

思路来源:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419/

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: