1. 程式人生 > >Leetcode:125.驗證迴文串

Leetcode:125.驗證迴文串

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

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

示例 1:

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

示例 2:

輸入: "race a car"
輸出: false

解題思路:

雙指標法,初始位置left=0,right=size-1。遇到英文字母或者數字之外的字元跳過,遇到不相等的兩端return false。迴圈的跳出條件是left<right。注意這裡的字元相等可以包含兩個數字相等,兩個英文字母相等,以及兩個英文字母不考慮大小寫相等也就是相差32。本題主要涉及的邏輯判斷包括:

1. 判斷一個字元是否是數字。#define isNUM(x) (x>='0'&&x<='9')

2. 判斷一個字元是否是英文字母。#define isA_Z(x) (x>='a'&&x<='z'||x>='A'&&x<='Z')

3. 判斷兩個字元相等,注意是本題定義的等價。#define equ(x,y) ((isA_Z(x)||isNUM(x))&&(x==y||(isA_Z(x)&&isA_Z(y)&&abs(int(x-y))==32)))

4. 注意3中用到了絕對值,因此可以再加#define abs(x) (x>0?x:-x),提速。

                                  

C++程式碼
#define abs(x) (x>0?x:-x)
#define isNUM(x) (x>='0'&&x<='9')
#define isA_Z(x) (x>='a'&&x<='z'||x>='A'&&x<='Z')
#define equ(x,y) ((isA_Z(x)||isNUM(x))&&(x==y||(isA_Z(x)&&isA_Z(y)&&abs(int(x-y))==32)))
class Solution {
public:
    bool isPalindrome(string s) {
        int size = s.size();
        if (size <= 1)  return true;
        int left = 0, right = size - 1;
        while (left < right) {
            if (!(isA_Z(s[left])||isNUM(s[left]))) { left++; continue; }
            if (!(isA_Z(s[right])||isNUM(s[right]))) { right--; continue; }
            if (!equ(s[left], s[right])) return false;
            left++; right--;
        }
        return true;
    }
};