LeetCode演算法題125:驗證迴文串解析
阿新 • • 發佈:2018-11-11
給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。
說明: 本題中,我們將空字串定義為有效的迴文串。
示例1:
輸入: "A man, a plan, a canal: Panama"
輸出: true
示例2:
輸入: "race a car"
輸出: false
這個題首先的想法是先把所有字元轉換成小寫,然後取出所有字母數字,然後反向對比,但是這樣一般的思路來說要進行三次迴圈,事實上完全可以走一次迴圈完成。左右兩邊開始遍歷,如果左邊或者右邊不是字母數字,那就更新索引,如果都是字母或數字,則進行對比(這裡要進行大小寫轉換的操作),不相等就返回false,相等則繼續對比,直到兩個索引相等。
C++原始碼:
class Solution {
public:
bool isPalindrome(string s) {
int left = 0;
int right = s.size() - 1;
while(left < right){
if (!isalnum(s[left])) left++;
else if (!isalnum(s[right])) right--;
else if ((s[left]+32-'a')%32 != (s[right]+32-'a' )%32) return false;
else{
left++;
right--;
}
}
return true;
}
};
python3原始碼:
class Solution:
def isPalindrome(self, s):
"""
:type s: str
:rtype: bool
"""
left = 0
right = len(s) - 1
while left < right:
if not s[left].isalnum():
left += 1
elif not s[right].isalnum():
right -= 1
elif s[left].upper() != s[right].upper():
return False
else:
left += 1
right -= 1
return True