LeetCode笔记——125验证回文串

题目:

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true

示例 2:

输入: "race a car"
输出: false

思路:回文串从前往后和从后往前的字符串是相同的。在本题中空字符串也定义为回文字符串。设置两个指针left,right,先找到是字母或数字的字符,这一步主要是排除字符串中的空格;然后比较字符是否相等,这里有挺多复杂的情况,比如说两者是同一字母的大小写(题目中说忽略字母大小写,两者相差32),还可能将数字和字母错认成大小写(比如字母P,80和数字048),需要特殊考虑;相等就改变索引继续查找,不相等就返回false.以下是根据网上大神整理的代码。

代码:

class Solution {
    public boolean isPalindrome(String s) {
         if (s == null) {
            return true;  //空字符串也为回文字符串
        }
      

        int left = 0;
        int right = s.length() - 1;

        int delta = 'A' - 'a';
        char l;
        char r;

        while (left < right) {
            while (left < s.length() && !isAlphanumericCharacters(s.charAt(left))) { // 从左向右找数字与字母
                left++;
            }

            while (right >= 0 && !isAlphanumericCharacters(s.charAt(right))) { // 从右向左找数字与字母
                right--;
            }

            if (left < right) {
                l = s.charAt(left);
                r = s.charAt(right);
                if (l == r || (l - r == delta) &&isAA(l,r)|| (r - l == delta)&&isAA(l,r)) {
                    left++;
                    right--;
                } else {
                    return false;
                   // break;
                }
            }
        }

       return true ;
    }

    
    //判断字符c是否为数字或字母
    private boolean isAlphanumericCharacters(char c) {
        return c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';
    }
    //针对一种特殊的用例,数字和字母之间的差为大小写之间的差
    private boolean isAA(char a,char b)
    {
        return ((a >= 'a' && a <= 'z')&&(b>= 'A' && b <= 'Z')) || ((b >= 'a' && b <= 'z')&&(a>= 'A' && a <= 'Z'));
        
    }
    }

 

你可能感兴趣的:(LeetCode笔记)