版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37922734/article/details/82664051
class Solution(object):
#暴力破解法
# def ispalindromic(self, s):
# if s == s[::-1]:
# return True
# else:
# return False
# def longestPalindrome(self, s):
# """
# :type s: str
# :rtype: str
# """
# if len(s) <= 1:
# return s
# final_string = ""
# for i in range(len(s)-1):
# for j in range(len(s)-i):
# substring = s[j:(j+i+2)]
# if self.ispalindromic(substring) and len(substring) > len(final_string):
# final_string = substring
# return final_string
# def longestPalindrome(self, s):
# """
# :type s: str
# :rtype: str
# """
# if len(s) <= 1:
# return s
# final_string = ""
# re_string = s[::-1]
# for i in range(len(s)-1):
# for j in range(len(s)-i):
# if s.find(re_string[j:i+j+2]) !=-1:
# if len(re_string[j:i+j+2]) < len(final_string):
# final_string = re_string[j:i+j+2]
# return final_string
#枚举法
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
final_string = ""
if len(s) <= 1:
return s
# if len(s) % 2 ==0:
for i in range(len(s)-1):
j=0
while i-j >= 0 and (i+1)+j < len(s):
if s[i-j] == s[(i+1)+j] :
if len(final_string) < len(s[i-j:(i+1)+j+1]):
final_string = s[i-j:(i+1)+j+1]
else:
break
j = j + 1
# if len(s) % 2 ==1:
for i in range(len(s)-1):
j=0
while i-j >= 0 and i+j < len(s):
if s[i-j] == s[i+j]:
if len(final_string) < len(s[i-j:i+j+1]):
final_string = s[i-j:i+j+1]
else:
break
j = j + 1
return final_string
解决思路:
1.得到最长回文字符串 采用的枚举法
2.分为两种查找,第一种是查找奇数个的回文,第二种查找是偶数个的回文
3.需要注意的是单个字符或者空字符的话返回原字符即可,因为循环语句中有for len(s)-1,只能对大于长度1的字符串进行判断和操作
4.主体思想是定位一个桩点,奇数个的话,围绕这个桩点左右比较是否相等,相等的话就说明已经找到一个,再判断长度是否比以前的字符串长,如果长的话就赋值,没有的话就不做操作,最后再迭代往外扩展,即++;如果不相等的话就break,没有进一步比较的意义了。偶数个的话就只需要和临近的比较,从而往外扩展