Leetcode:125.驗證迴文串
阿新 • • 發佈:2018-12-22
給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。
說明:本題中,我們將空字串定義為有效的迴文串。
示例 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),提速。
#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; } }; |