題目:給定字符串,僅考慮字母數字字符,忽略大小寫,判斷是否為回文串。空串視為合法回文。
示例:"A man, a plan, a canal: Panama" → true;"race a car" → false。
思路:左右雙指針 i、j 向中間收縮,跳過非字母數字字符,比較字符(統一轉小寫)。
s.toLowerCase(),簡化後續判斷。i=0, j=len-1。i <= j:while 跳過左側非法字符:!((s[i]>='0'&&s[i]<='9') || (s[i]>='a'&&s[i]<='z')) && i。 s[i] 與 s[j],不等則返回 false。i++、j-- 繼續。i 確保指針不越界交叉;空串 len==-1 直接返回 true。 toLowerCase() 比每次 Character.toLowerCase() 更高效。時間 O(n) 單次掃描,空間 O(1) 僅用常數額外變量(不計輸入字符串空間)。
public boolean isPalindrome(String s) {
s = s.toLowerCase();
int len = s.length() - 1;
if (len == -1) return true;
for (int i = 0, j = len; i <= j; i++, j--) {
for (; !((s.charAt(i)>='0'&&s.charAt(i)<='9') || (s.charAt(i)>='a'&&s.charAt(i)<='z')) && i < j; i++);
for (; !((s.charAt(j)>='0'&&s.charAt(j)<='9') || (s.charAt(j)>='a'&&s.charAt(j)<='z')) && i < j; j--);
if (s.charAt(i) != s.charAt(j)) return false;
}
return true;
}
雙指針是驗證回文類問題的標準解法。本題難點在於「非原地過濾非法字符」與「大小寫無關」的工程化處理。預處理小寫 + 內層 while 跳過非法字符,代碼緊湊高效,適合面試現場默寫。