1. 程式人生 > 其它 >超詳細講解:leetcode-0125-ValidPalindrome(驗證迴文串)

超詳細講解:leetcode-0125-ValidPalindrome(驗證迴文串)

技術標籤: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。
    (4)時間複雜度:O(n)
    (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的結果:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20201117215917732.png#pic_center

6. 相關題目