快轉到主要內容
leetcode 125 - Valid Palindrome

leetcode 125 - Valid Palindrome

·
類別 
Leetcode
標籤 
Java Leetcode Easy String Problem Two Pointers Problem Blind75
Eason Chiu
作者
Eason Chiu
一個不做筆記就容易忘記的工程師
目錄

題目
#

leetcode 125 - Valid Palindrome (題目說明請點連結)

題目簡述
#

判斷一個字串是否為有效的回文。

範例
#

Example 1:

Input: s = "A man, a plan, a canal: Panama"
Output: true
Explanation: 移除所有非字母數字字符後得到 "amanaplanacanalpanama",這是回文字符串。

Example 2:

Input: s = "race a car"
Output: false
Explanation: 移除所有非字母數字字符後得到 "raceacar",這不是回文字符串。

Example 3:

Input: s = " "
Output: true
Explanation: 空字符串被認為是回文字符串。

解題思路
#

這題要求我們判斷一個字符串是否為回文字符串。回文字符串是指正著讀和倒著讀都一樣的字符串。我們需要忽略大小寫和非字母數字字符。

解法
#

雙指針法(Two Pointers Approach)

  1. 先對字符串進行預處理,轉換為小寫並移除所有非字母數字字符
  2. 使用左右兩個指針從兩端向中間移動
  3. 比較對應位置的字符是否相同

步驟
#

  • 預處理階段:
    • 將字符串轉換為小寫
    • 使用正則表達式移除所有非字母數字字符
  • 雙指針比較:
    • 初始化 left = 0right = s.length() - 1
    • left < right 時,比較 s.charAt(left)s.charAt(right)
    • 如果不相同,返回 false
    • 移動指針:left++right--
  • 最終結果:
    • 如果所有字符都相同,返回 true

例子說明
#

s = "A man, a plan, a canal: Panama"

  1. 預處理:

    • 轉換為小寫:"a man, a plan, a canal: panama"
    • 移除非字母數字:"amanaplanacanalpanama"
  2. 雙指針比較:

    • left = 0right = 19
    • 比較 'a''a':相同,left++right--
  3. 繼續比較:

    • left = 1right = 18
    • 比較 'm''m':相同,left++right--
  4. 中間相遇:

    • left >= right 時,停止比較
    • 所有字符都相同,返回 true

完整程式碼
#

java
class Solution {
    public boolean isPalindrome(String s) {
        // 將字符串轉換為小寫,並移除所有非字母數字字符
        s = s.toLowerCase().replaceAll("[^a-z0-9]", "");

        // 初始化左右指針
        int left = 0, right = s.length() - 1;

        // 使用雙指針從兩端向中間移動,比較對應位置的字符
        while(left < right){
            // 如果左右指針指向的字符不同,則不是回文字符串
            if(s.charAt(left) != s.charAt(right)){
                return false;
            }
            // 移動指針
            left++;
            right--;
        }

        // 如果所有字符都相同,則是回文字符串
        return true;
    }
}

時間複雜度
#

  • 時間複雜度O(n),其中 n 是字符串的長度
    • 預處理階段:O(n)(轉換和正則表達式)
    • 雙指針比較:O(n/2)O(n)
  • 空間複雜度O(n),需要創建新的字符串來存儲預處理後的結果

相關文章

leetcode 268 - Missing Number
類別 
Leetcode
標籤 
Java Leetcode Easy Array Problem Blind75
leetcode 217 - Contains Duplicate
類別 
Leetcode
標籤 
Java Leetcode Easy Array Problem Blind75
leetcode 21 - Merge Two Sorted Lists
類別 
Leetcode
標籤 
Java Leetcode Easy Linked List Problem Blind75