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

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

     編輯:C++ 入門

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

題目:給定字符串,僅考慮字母數字字符,忽略大小寫,判斷是否為回文串。空串視為合法回文。
示例:"A man, a plan, a canal: Panama" → true;"race a car" → false。

雙指針原地驗證

思路:左右雙指針 i、j 向中間收縮,跳過非字母數字字符,比較字符(統一轉小寫)。

  1. 先將整串轉小寫 s.toLowerCase(),簡化後續判斷。
  2. 初始化 i=0, j=len-1。
  3. 循環條件 i <= j:
    • 內層 while 跳過左側非法字符:!((s[i]>='0'&&s[i]<='9') || (s[i]>='a'&&s[i]<='z')) && i。
    • 同理跳過右側非法字符。
    • 比較 s[i] 與 s[j],不等則返回 false。
    • i++、j-- 繼續。
  4. 循環結束返回 true。

關鍵細節

  • 字符合法性判斷:ASCII 範圍直接比較,避免正則或庫函數開銷。
  • 邊界處理:i 確保指針不越界交叉;空串 len==-1 直接返回 true。
  • 大小寫統一:預處理 toLowerCase() 比每次 Character.toLowerCase() 更高效。

複雜度

時間 O(n) 單次掃描,空間 O(1) 僅用常數額外變量(不計輸入字符串空間)。

代碼(Java)

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 跳過非法字符,代碼緊湊高效,適合面試現場默寫。

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