我发现最近做题,我总是被“阵势”唬住,不管什么题,就先觉得自己不会了,不想去思考,这种习惯比较可怕。其实任何难题,只要你学会分解它,并逐一击破,其实你发现你是可以解决的。
就像这道题,一个是要“删去”非正常字符例如':空格呀什么的,最后要的只有数字和字符。所以要有一个函数判断是否有效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; } };