LeetCode: Valid Palindrome [125]

weixin_33831673發表於2015-06-04

【題目】

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

For example,
"A man, a plan, a canal: Panama" is a palindrome.
"race a car" is not a palindrome.

Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.

For the purpose of this problem, we define empty string as valid palindrome.


【題意】

    給定一個字串,僅僅關注英文字母和數字,忽略其它字元。問英文字母和數字按序排列後是否構成是迴文


【思路】

    利用迴文串推斷的老辦法就可以,兩個指標p1, p2分別從頭和尾中間掃描,推斷對稱位置的字元是否同樣,僅僅只是須要跳過除英文字母和數字之外的其它字元。
    另外還須要注意處理2中特殊情況:(1)字串為空串,(2)字串不是空串,但裡面沒有英文字母或者數字。 這兩種情況都判定為true
    


【程式碼】

class Solution {
public:
    bool isAlphanumeric(char c){
        if(isdigit(c))return true;
        if(c>='A'&&c<='Z'||c>='a'&&c<='z')return true;
        return false;
    }
    
    bool isEqual(char c, char b){
        if(isdigit(c))return c==b;
        if(c>='A'&&c<='Z')c='a'+(c-'A');
        if(b>='A'&&b<='Z')b='a'+(b-'A');
        return c==b;
    }

    bool isPalindrome(string s) {
        int len=s.length();
        if(len==0)return true;
        
        int front=0;
        int back=len-1;
        while(front<back){
            while(front<=back && !isAlphanumeric(s[front]))front++;
            while(front<=back && !isAlphanumeric(s[back]))back--;
            if(front<=back){
                if(!isEqual(s[front], s[back]))return false;
                front++;
                back--;
            }
        }
        return true;
    }
};


相關文章