首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode Valid Palindrome:雙指針驗證回文串

     編輯:關於C++

問題描述

判斷字符串是否為回文。只考慮字母數字字符,忽略大小寫。非字母數字字符跳過。
例:"A man, a plan, a canal: Panama" → true
"race a car" → false

雙指針算法

左右指針向中間移動,跳過非法字符,比較合法字符(忽略大小寫)。

完整代碼

class Solution {
public:
    bool isPalindrome(string s) {
        int l = 0, r = s.size() - 1;
        while (l < r) {
            while (l < r && !isalnum(s[l])) ++l;
            while (l < r && !isalnum(s[r])) --r;
            if (l < r) {
                if (tolower(s[l]) != tolower(s[r])) return false;
                ++l; --r;
            }
        }
        return true;
    }
};

關鍵點

  • `isalnum` 判斷字母數字,`tolower` 統一小寫比較
  • 循環條件 `l < r` 而非 `l <= r`,避免中間字符重複比較
  • 跳過非法字符時需檢查 `l < r` 防止越界
  • 時間 O(n),空間 O(1)

易錯點

  1. 忘記 `` 頭文件導致 `isalnum`/`tolower` 未聲明
  2. 字符有符號性問題:`char` 可能為負值,建議轉 `unsigned char` 再傳給 `isalnum`
  3. 空字符串或全非法字符應返回 true(空串視為回文)

擴展:Unicode 支持

C++ 標準庫不直接支持 Unicode 字符分類。需用 ICU 庫或手動判斷字符範圍(如中文字符不在 ASCII 字母數字範圍內)。

此題是雙指針處理字符串「有效字符過濾 + 比較」的標準模式,代碼極簡但邊界條件需謹慎處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved