1. 程式人生 > 其它 >125. 驗證迴文串(LeetCode)

125. 驗證迴文串(LeetCode)

  • 題目描述

給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。

說明:本題中,我們將空字串定義為有效的迴文串。

示例 1:

輸入: "A man, a plan, a canal: Panama"
輸出: true

  • 題目條件分析

  1. 迴文串是指對稱的字串;
  2. 只需要考慮字母和數字,忽略大小寫;
  3. 空字串為有效迴文串;
  • 解題思路(指標對撞)

  1. 定義兩個指標left和right分別指向字串的首尾,如果不相等,則不是(快速失敗),否則一直比較到兩個指標相遇(說明是迴文串)
  2. 要快速跳過無效字元和比較是否相等,可考慮使用字元的ascii碼來進行判斷;
  • 編碼如下

public boolean isPalindrome(String s) {
    char[] charArray = s.toCharArray();
    int left = 0;
    int right = charArray.length-1;
    char leftChar,rightChar;
    while(left<right) {
        leftChar = charArray[left];
        if(!isLetterOrDigit(leftChar)) {
            left++;
            continue;
        }
        rightChar = charArray[right];
        if(!isLetterOrDigit(rightChar)) {
            right--;
            continue;
        }
        int substract = leftChar - rightChar;
        if (isDigit(leftChar) || isDigit(rightChar)) {
            if (substract != 0) {
                return false;
            }
        }
        if (substract != 0 && substract != 32 && substract != -32) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}

public boolean isDigit(char c) {
    return c>='0' && c<='9';
}

public boolean isLetterOrDigit(char c) {
    return isDigit(c) || (c>='a' && c<='z') || (c>='A' && c<='Z');
}