超詳細講解:leetcode-0125-ValidPalindrome(驗證迴文串)
阿新 • • 發佈:2021-01-05
技術標籤:leetcodepythonpythonleetcode指標
文章目錄
1. 題目地址
2. 題目描述
- 英文描述
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases. Note: For the purpose of this problem, we define empty string as valid palindrome. Example 1: Input: "A man, a plan, a canal: Panama" Output: true Example 2: Input: "race a car" Output: false
- 中文描述
給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。
說明:本題中,我們將空字串定義為有效的迴文串。
示例 1:
輸入: "A man, a plan, a canal: Panama"
輸出: true
示例 2:
輸入: "race a car"
輸出: false
3. 解題思路
- 這是一道最簡單的考察迴文串的題目,就是判斷一個字串是不是迴文。
- 解題重點:雙指標
(1)採用雙指標:一個頭指標,一個尾指標,分別指向字串的頭和尾。
(2)若兩個指標上的元素不相同,則直接返回False,結束判斷。
(3)若兩個指標上的元素相同,則頭指標向後一步,尾指標向前進一步,頭尾指標同時更新,直到頭尾指標相遇,返回True;或者所指的元素出現不相同的情況,返回False。
(5)空間複雜度:O(1) - 注意1:題目要求是隻考慮數字和字母,所以對字串中出現的其他字元就不要做任何處理和判斷了。判斷是否是數字和字母,可以採用**isalnum()**方法。
以python中的用法為例:str.isalnum()
用來檢測字串是否由字母和數字組成,是就返回True,否則返回False。
例1:
str = “this2009”
print(str.isalnum())
True
例2:
str = “this is string example…wow!!!”
print(str.isalnum())
False
- 注意2:題目要求是忽略字母大小寫,所以在判斷元素是否相等時,可以統計轉換成大寫或者小寫字母,再進行判斷。
以python中的用法為例:
(1)str.lower() 方法是將字串中所有的大寫字元轉換為小寫。
(2)str.upper() 方法是將字串中所有的小寫字元轉換為大寫。
4. 解題關鍵
- 要想到頭尾雙指標的操作
- 第1步:兩個指標,一個指向頭,一個指向尾。
- 第2步:若頭尾指標上的元素不相等,直接返回False,結束。
- 第3步:若頭尾指標上的元素相等,同時更新前進,直到頭尾指標相遇或者出現不相等。
- 要點
- 只考慮數字和字母:用str.isalnum()判斷。
- 忽略字母大小寫:統一成str.lower()或str.upper()再比較。
- 複雜度
- 時間複雜度:O(n)
- 空間複雜度:O(1)
5. 示例程式碼
python
# coding:utf-8
'''
# @Method:按位運算
# @Author: wlhr62
'''
# coding:utf-8
'''
# @Method:按位運算
# @Author: wlhr62
'''
import os
class Solution:
def isPalindrome(self, s: str) -> bool:
left = 0
right = len(s) - 1
while left < right:
if not s[left].isalnum():
left += 1
continue
if not s[right].isalnum():
right -= 1
continue
if s[left].lower() == s[right].lower():
left += 1
right -= 1
continue
else:
break
return right <= left
if __name__ == "__main__":
str1 = "A man, a plan, a canal: Panama"
str2 = "race a car"
A = Solution()
res1 = A.isPalindrome(str1)
print(str1 + "的判斷結果:", res1)
res2 = A.isPalindrome(str2)
print(str2 + "的判斷結果:", res2)
執行結果
A man, a plan, a canal: Panama的判斷結果: True
race a car的判斷結果: False
在leetcode上AC的結果: