迴文字符串判斷彙總

Lc 125 驗證迴文字符串

class Solution:
    def judgeNumOrStr(self,a):
        if ord('0')<=ord(a)<=ord('9') or ord('a')<=ord(a)<=ord('z'):
            return True
        else:
            return False

    def isPalindrome(self, s: str) -> bool:
        s = s.lower()

        i,j = 0,len(s)-1
        while i<j:
            if not self.judgeNumOrStr(s[i]):
                i+=1
                continue
            if not self.judgeNumOrStr(s[j]):
                j-=1
                continue
            if s[i] != s[j]:
                return False
            i+=1
            j-=1
        return True

 

Lc 680 驗證迴文字符串Ⅱ

先寫一個單獨驗證迴文字符串的函數A,然後判斷的時候如果不相等則調用A判斷 [i+1,j] 或者 [i,j-1]是否爲迴文

class Solution:
    def judgestr(self,s,i,j):
        while i<j:
            if s[i] != s[j]:
                return False
            i+=1
            j-=1
        return True
        
    def validPalindrome(self, s: str) -> bool:
        i, j = 0,len(s)-1
        count = 0
        while i<j:
            if s[i] != s[j]:
                if self.judgestr(s,i+1,j) or self.judgestr(s,i,j-1):
                    return True
                else:
                    return False
            i+=1
            j-=1
                
        return True

 

Lc 234 迴文鏈表

用 O(n) 時間複雜度和 O(1) 空間複雜度解決

用快慢指針找到中間節點,反轉後半部分,然後進行對比

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList(self,head):
        pre = None
        p = head
        while p:
            nextNode = p.next
            p.next = pre
            pre = p
            p = nextNode
        return pre

    def isPalindrome(self, head: ListNode) -> bool:
        if not head or not head.next:
            return True
        slow,fast = head,head
        while fast.next and fast.next.next:
            slow = slow.next
            fast = fast.next.next
        
        mid = slow.next
        slow.next = None
        left = head
        right = self.reverseList(mid)

        while left and right:
            if left.val != right.val:
                return False
            left = left.next
            right = right.next
        return True

 

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