天天看點

LeetCode_125_驗證回文串

題目描述:

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

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

輸入示例1:
輸入: "A man, a plan, a canal: Panama"
輸出: true
輸入示例2:
輸入: "race a car"
輸出: false      

算法思想:雙指針法,設定頭尾兩個指針,判斷兩個指針目前所指字元是否為合法字元,是則進行比較,反之則向下一個字元移動,直到找到合法字元,然後在進行比較

class Solution {
public:
    bool isPalindrome(string s) {
        for(int i=0,j=s.size()-1;i<j;){
            char ic=s[i];
            char jc=s[j];
            if(ic>='A'&&ic<='Z')
                ic=ic+' ';
            if(jc>='A'&&jc<='Z')
                jc=jc+' ';
            if (!(ic >= 'a' && ic <= 'z' || ic >= '0' && ic <= '9')) {//判斷目前字元是否為合法字元
                i++;
                continue;
            }
            if (!(jc >= 'a' && jc <= 'z' || jc >= '0' && jc <= '9')) {
                j--;
                continue;
            }
            //當ic和jc都是合法字元時,再判斷是否相等
            if (jc != ic) return false;
            i++;
            j--;
        }
        return true;
    }
};      
LeetCode_125_驗證回文串
class Solution {
public:
    bool isPalindrome(string s) {
        if(s.size() <= 1) return true;
        int i = 0, j = s.size() - 1;
        while(i < j){
            while(i < j && !isalnum(s[i])) // 排除所有非字母或數字的字元
                i++;
            while(i < j && !isalnum(s[j]))
                j--;
            if(tolower(s[i++]) != tolower(s[j--])) //統一轉換成小寫字母再比較
                return false;
        }
        return true;
    }
};      

isalnum(char a)用于判斷字元是否是數字或者字元,是傳回非零數,否則傳回0