剑指 Offer II 018. 有效的回文

这题不难,但是很多细节问题:

  1. 除了数字和字母,其它字符都跳过。
  2. 判断字符是否相等,先使用 Character.toLowerCase(char c) 转换为小写字母,然后再使用 == 判断即可。

    1. class Solution {
    2. public boolean isPalindrome(String s) {
    3. if (s == null || s.length() == 0) return true;
    4. int left = 0, right = s.length() - 1;
    5. while (left < right) {
    6. while (left < right && pass(s.charAt(left))) left++;
    7. while (left < right && pass(s.charAt(right))) right--;
    8. if (!isSame(s.charAt(left),s.charAt(right))) return false;
    9. left++;
    10. right--;
    11. }
    12. return true;
    13. }
    14. // 与运算是不行的,对OP来说会返回错误
    15. private boolean isSame(char a, char b) {
    16. a = Character.toLowerCase(a);
    17. b = Character.toLowerCase(b);
    18. // System.out.println(a + " ," + b + ", " + (a - b));
    19. // int diff = Math.abs(a - b);
    20. // return diff == 32 || diff == 0;
    21. return a == b;
    22. // a = (char)(a | 32);
    23. // b = (char)(b | 32);
    24. // if (a == b) return true;
    25. // else return false;
    26. }
    27. private boolean pass(char c) {
    28. c = (char)(c | 32);
    29. if (c >= 'a' && c <='z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9') return false;
    30. else return true;
    31. }
    32. }