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