LeetCode-5.最長迴文子串——又見雙指針

題目:最長迴文子串

思路🤔——還是雙指針

迴文序列,那就是正着反着讀一樣。所以很容易想到雙指針夾逼的方法

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章