def recall(s,center1,center2=-1): #center1在左 center2在右边 或者只有center1
if center2 == -1: #如果只有center1一个中心点
lens = 1 # 回文的长度
i=center1-1
j=center1+1
while(i >= 0 and j < len(s)):
if s[i] != s[j]:
i = i + 1
j = j - 1
break
lens=j-i+1
i=i-1
j=j+1
if i < 0 or j >= len(s):
i = i + 1
j = j - 1
break
return lens,i,j
else:
lens = 2
i=center1-1
j=center2+1
while (i >= 0 and j < len(s)):
if s[i] != s[j]:
i = i + 1
j = j - 1
break
lens = j - i + 1
i = i - 1
j = j + 1
if i < 0 or j >= len(s):
i = i + 1
j = j - 1
break
if lens == 2:
i = center1
j = center2
return lens,i,j
class Solution(object):
def longestPalindrome(self, s):
#特殊情况
if len(s) == 1:
return s
if len(s) == 2:
if s[0] == s[1]:
return s
else:
return s[0]
###
most=0
for i in range(len(s)-1): #以i为中心的两种情况都要列出来
x1,begin,end=recall(s,i)
if x1 > most:
most=x1
result=s[begin:end+1]
if s[i] == s[i+1]:
x2,begin,end=recall(s,i,i+1)
if x2 > most:
most=x2
result=s[begin:end+1]
if most == 1:
result = s[0]
return result
思路:暴力破解
一个字符串是回文字符串的标致是以字符串中心点开始,两边对称,例如:abcba,abccba等等
所以,会有两种情况,①字符串长度为奇数 ②字符串长度为偶数
①字符串长度为奇数时,以中间元素切开,分为两边,两边对称,令中间元素为中心
②字符串长度为偶数且中间两个元素相等时,直接从中间切开,两边对称,这时,可令中轴线两边的元素为中心
所以,检查以i为中心的子字符串和以i、i+1为中心的子字符串,是否符合回文字符串的定义
(1)特殊情况:
① 字符串长度为1,直接返回
② 字符串长度为2,比较第一个和第二个元素是否相同,是返回整个字符串,不是返回第一个元素
(2)从头开始,将元素作为中心点,使用两个指向指向中心点的两侧向两头走,直到所指元素不相等或者越界,即对应字符串长度为奇数的情况。
(3)如果下一个元素当前元素相同,则对应字符串长度为偶数的情况。
(4)得到字符串以及长度,保留长度更长的回文字符串
(5)遍历字符串,执行(2)、(3)、(4),直到字符串尾