給定字符串 s,僅考慮字母數字字符、忽略大小寫,判斷是否為回文。空串視為合法回文。
public boolean isPalindrome(String s) {
if (s == null) return true;
int left = 0, right = s.length() - 1;
while (left < right) {
char lc = Character.toLowerCase(s.charAt(left));
char rc = Character.toLowerCase(s.charAt(right));
if (!Character.isLetterOrDigit(lc)) { left++; continue; }
if (!Character.isLetterOrDigit(rc)) { right--; continue; }
if (lc != rc) return false;
left++; right--;
}
return true;
}
Character.isLetterOrDigit() 同時檢查字母和數字,比手寫 ASCII 範圍更健壯。toLowerCase() 逐字符轉換,避免整串轉換的額外空間。continue),合法字符比較後雙向收攏。String filtered = s.chars()
.filter(Character::isLetterOrDigit)
.mapToObj(c -> String.valueOf((char)Character.toLowerCase(c)))
.collect(Collectors.joining());
return filtered.equals(new StringBuilder(filtered).reverse().toString());
✅ 代碼簡潔 ❌ O(N) 額外空間,面試中常被追問「能否 O(1) 空間」。
| 輸入 | 輸出 | 說明 |
|---|---|---|
| "A man, a plan, a canal: Panama" | true | 經典回文,含標點空格 |
| "race a car" | false | 非回文 |
| "" | true | 空串 |
| "0P" | false | 數字+字母,大小寫敏感 |
| ".," | true | 全非法字符 → 空串 |
Java char 只能處理 BMP 字符(U+0000~U+FFFF)。若輸入含 Emoji(輔助平面),需用 codePointAt/codePointBefore 處理代碼點,邏輯相同但指針移動變為 left += Character.charCount(cp)。