一、题设
给你一个字符串 s
,找到 s
中最长的回文子串。
二、基本思路
1.从字符串最大个数往最小个数查找是回文字符串的,一旦找到,立刻停止。
2.两层循环的边界根据数字规律列出。
3.当字符串中只有一个字符时,直接返回即可。
lens | i | span | [span,lens+1) | [step,step + span) |
5 | 1 | 5 | 1次 | [0,5) |
5 | 2 | 4 | 2次 | [0,4)、[1,5) |
5 | 3 | 3 | 3次 | [0,3)、[1,4)、[2,5) |
5 | 4 | 2 | 4次 | [0,2)、[1,3)、[2,4)、[3,5) |
5 | 5 | 1 | 5次 | [0,1)、[1,2)、[2,3)、[3,4)、[4,5) |
三、代码实现
class Solution(object):
def longestPalindrome(self, s):
lens = len(s)
# 一个字符返回本身
if lens == 1:
return s
# 判断次数
for i in range(1,lens+1):
#区间大小
span = lens - i + 1
#移动
step = 0
# 子串个数
for j in range(span,lens+1):
# 截取子串
string = s[step : step + span]
#判断是否回文字符串
left = 0
right = len(string) - 1
while (left < right):
if string[left] != string[right]:
break
left += 1
right -= 1
if left >= right:
return string
step += 1
四、效率总结
图1:上述做法
图2:官方解法
由图所示,上述的解法比官方解法的空间复杂度更低,但是时间慢了整整一秒,这无疑是出现了循环的冗杂,但是优劣也不好评判,所以我还是坚持自己的做法了喔,这样更简单易懂不是么,okok今天就到这儿了,明天见~