LeetCode-5.最长回文子串——又见双指针

题目:最长回文子串

LeetCode-5.最长回文子串——又见双指针_第1张图片

思路——还是双指针

回文序列,那就是正着反着读一样。所以很容易想到双指针夹逼的方法

 

  • 指定指针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 

 

你可能感兴趣的:(LeetCode,Python,#双指针)