题目:最长回文子串
思路🤔——还是双指针
回文序列,那就是正着反着读一样。所以很容易想到双指针夹逼的方法
- 指定指针p从字符串前端开始循环,同时指定指针q从字符串后端开始循环(往前走,一次一步),q每走完全程(遇到p)或得到了答案,则p前进一步,q再从末尾开始循环;
- 当p、q双指针指向的字符一致时,查看[p:q+1]的子串,正读、反读是否一致:
- 若一致,则和当前回文子串比长度,留更长的那个。然后break内从的q指针循环(因为q越循环子串越短,后面的没必要再查)
- 若不一致,那就pass咯
- 此外,在q每次开始循环的时候先检查一下剩余子串和回文序列哪个更长。若回文序列更长,那么也没必要再查了,直接break
Code:
class Solution:
def longestPalindrome(self, s: str) -> str:
if len(s) < 2:
return s
huiwen = s[0]
for p in range(0, len(s), 1):
for q in range(len(s)-1, p, -1): # 倒着循环,效率更高(注意end是取不到的)
if len(huiwen) > q-p+1: # 若当前回文序列比可能最长的序列还长,就别查了
break
if s[p] == s[q]:
sub = s[p:q+1] # 切片末位取不到
if sub == sub[::-1]:
huiwen = sub if len(sub) > len(huiwen) else huiwen # 谁长留下谁
break # break内层q的循环
return huiwen