【算法】【字符串】验证回文串

1  题目

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 

示例 1:

输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。

示例 2:

输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。

示例 3:

输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。

提示:

  • 1 <= s.length <= 2 * 105
  • s 仅由可打印的 ASCII 字符组成

2  解答

class Solution {
    public boolean isPalindrome(String s) {
        // 参数边界校验
        if (s == null || s.length() == 0) {
            return true;
        }
        // 因为有其他非字母字符存在,所以从中间往两边校验不行
        // 所以从两边向中间校验即可
        int leftIndex = 0;
        int rightIndex = s.length() - 1;
        // 左右指针
        while (leftIndex < rightIndex) {
            // 左指针 不是数字字母字符的略过
            while (leftIndex < rightIndex && !checkChar(s.charAt(leftIndex))) {
                leftIndex++;
            }
            // 右指针 不是数字字母字符的略过
            while (leftIndex < rightIndex && !checkChar(s.charAt(rightIndex))) {
                rightIndex--;
            }
            // 如果左指针小于右指针 
            if (leftIndex < rightIndex) {
                // 两者不相等的话 直接返回 false
                if (changeChar(s.charAt(leftIndex)) != changeChar(s.charAt(rightIndex))) {
                    return false;
                }
            }
            leftIndex++;
            rightIndex--;
        }
        // 遍历完说明是回文
        return true;
    }


    /**
     * 校验字符是不是字母
     */
    private boolean checkChar(char c) {
        return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') ? true : false;
    }

    /**
     * 转换字母统一为小写
     */
    private char changeChar(char c) {
        if ('A' <= c && c <= 'Z') {
            c = (char)(c + 32); 
        }
        return c;
    }
}

加油。

posted @ 2024-01-21 20:50  酷酷-  阅读(9)  评论(0编辑  收藏  举报