給定一個字符串,驗證它是否為回文串。只考慮字母數字字符,忽略大小寫。空字符串視為有效回文。
l=0,右指針 r=s.length()-1。l < r:
s[l] 非字母數字,l++ 繼續。s[r] 非字母數字,r-- 繼續。tolower(s[l]) 和 tolower(s[r]),不等返回 false。l++, r--。bool isPalindrome(string s) {
int l = 0, r = s.size() - 1;
while (l < r) {
if (!isalnum(s[l])) { l++; continue; }
if (!isalnum(s[r])) { r--; continue; }
if (tolower(s[l]) != tolower(s[r])) return false;
l++; r--;
}
return true;
}
isalnum(c):判斷是否字母或數字(<cctype>)。tolower(c) / toupper(c):大小寫轉換。"A man, a plan, a canal: Panama" → true。Valid Palindrome 是雙指針技巧的入門題。關鍵在於「跳過非法字符」與「統一大小寫比較」的邏輯順序。同類技巧廣泛用於「字符串去噪比較、子序列匹配」等問題。