Easy 125. Valid Palindrome
In this blog I will share a solution to the Valid Palindrome problem.
2025-01-14
leetcodejavascript
Valid Palindrome
- link: https://leetcode.com/problems/valid-palindrome/
- topic: string, two pointers
- difficulty: easy
題目描述
給定一個字串,判斷它是否是回文。判斷規則如下:
- 忽略大小寫(例如:'A' 和 'a' 視為相同)
- 只考慮字母和數字
- 空字串或只有空格的字串都算是回文
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" 不是回文
解題思路
這題可以用「雙指針」的方式來解決,步驟如下:
- 清理字串
"A man, a plan, a canal: Panama" ↓ (轉小寫 + 移除特殊字元) "amanaplanacanalpanama"
- 使用雙指針比較
"amanaplanacanalpanama" L R // L = left pointer, R = right pointer "amanaplanacanalpanama" L R // 如果相同,兩個指針往中間移動 "amanaplanacanalpanama" L R // 一直比較到指針相遇
複雜度分析
- 時間複雜度:O(n),需要遍歷整個字串一次
- 空間複雜度:O(n),需要存儲清理後的字串
程式碼
const isPalindrome = (s) => {
// 1. 使用 optional chaining 和 nullish coalescing
const cleanStr = s?.toLowerCase()?.replace(/[^a-z0-9]/g, "") ?? ""
// 2. 使用解構賦值設置指針
let [left, right] = [0, cleanStr.length - 1]
// 3. 使用雙指針比較
while (left < right) {
// 使用 early return pattern
if (cleanStr[left] !== cleanStr[right]) return false
;[left, right] = [left + 1, right - 1]
}
return true
}
程式碼說明
- 錯誤處理
- 使用 optional chaining (
?.
) 處理 null/undefined - 使用 nullish coalescing (
??
) 提供預設值
- 使用 optional chaining (
- 程式碼可讀性
- 使用解構賦值讓程式碼更簡潔
- 加入適當的註解說明邏輯
- 使用 early return pattern
- 效能考量
- 避免重複計算字串長度
- 使用解構賦值一次更新兩個指針
解題心得
- 雙指針技巧
- 適合處理回文、排序等問題
- 可以有效減少迴圈次數
- 字串處理技巧
- 正則表達式是處理字串的好工具
- 善用 ES6+ 的字串方法