Leetcode Valid Palindrome

我发现最近做题,我总是被“阵势”唬住,不管什么题,就先觉得自己不会了,不想去思考,这种习惯比较可怕。其实任何难题,只要你学会分解它,并逐一击破,其实你发现你是可以解决的。

就像这道题,一个是要“删去”非正常字符例如':空格呀什么的,最后要的只有数字和字符。所以要有一个函数判断是否有效isValid。还有一点,就是大小写转换,坑爹C++里没有直接对字符串进行大小写转换的,刚开始看的是一个JAVA的代码。没错,我不是自己做出来的T.T,JAVA里是有对字符串进行大小写转换的。所以需要一个对字符转换的函数。其实有一个tolower的函数,当然你也可以进行c+32或者记不住的就是c-'A'+'a'。最后就是判断函数了,从第一个有效字符以及最后一个有效字符开始判断。附代码。

class Solution {  
public:  
    bool isValid(char c)  
    {  
        if('a' <= c && c <= 'z') return true;  
        if('A' <= c && c <= 'Z') return true;  
        if('0' <= c && c <= '9') return true;  
        return false;  
    }  
    char lowerCase(char c)  
    {  
        if('A' <= c && c <= 'Z') return c+32;  
        else return c;  
    }  
    bool isPalindrome(string s) {  
        if(s=="") return true;
        int l = 0;  
        int r = s.size()-1;  

        
        while(l < r)  
        {  
            while(!isValid(s[l])){ 
                l++;  //去掉所有非正常字符,才开始比较
                if(l>=r) return true; //比较结束前没有返回false就返回true
            }
            
            while(!isValid(s[r])){
                r--;
                if(l>=r) return true;
            }
            if(lowerCase(s[l]) != lowerCase(s[r]))  return false;
            l++;
            r--;
        }  
        return true;  
    }  
}; 

 

posted @ 2015-11-02 16:43  0giant  阅读(203)  评论(0编辑  收藏  举报