日新刷题 - 125. 验证回文串

131 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

一、题目描述:

125. 验证回文串 - 力扣(LeetCode) (leetcode-cn.com)

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= s.length <= 2 * 10^5
  • 字符串 s 由 ASCII 字符组成

二、思路分析:

判断回文字符串,使用两个指针分别从首尾遍历,注意除掉非数字字母元素。

如果遇到不是数字字母,可以用while来把指针移动到距离当前位置最近的数字和字母位置,但是外面的while循环没有动,所以之后要重新判断一下i < j。在外面的大while内,先去掉i的非字母数字,如果还满足i < j再去掉j的非字母数字,如果还满足i < j再判断是否一致,不一致退出,一致就移动指针。

class Solution {
    public boolean isPalindrome(String s) {
        int n = s.length();
        if (n == 1) return true;
        if (n == 0) return false;
        char[] arr = s.toCharArray();
        int i = 0, j = n - 1;
        while (i < j) {
            while (i < j && !Character.isLetterOrDigit(arr[i])) {
                i++;
            }
            while (i < j && !Character.isLetterOrDigit(arr[j])) {
                j--;
            }
            if (i < j) {
                if (Character.toLowerCase(arr[i]) != Character.toLowerCase(arr[j])) {
                    return false;
                }
                i++;
                j--;
            }
        }
        return true;
    }
}

也可以用两个if,如果i不是数字字母直接不执行后面的循环体,i++,直到是数字字母;j同理;如果都是数字字母,则判断是否一致,不一致推出,一致就移动指针。这两个if本质上就是把指针移动到离当前位置最近的数字和字母位置,只不过用的是外面的while循环。

class Solution {
    public boolean isPalindrome(String s) {
        int n = s.length();
        if (n == 1) return true;
        if (n == 0) return false;
        char[] arr = s.toCharArray();
        int i = 0, j = n - 1;
        while (i < j) {
            if (!Character.isLetterOrDigit(arr[i])) {
                i++;
                continue;
            }
            if (!Character.isLetterOrDigit(arr[j])) {
                j--;
                continue;
            }
            if (Character.toLowerCase(arr[i]) != Character.toLowerCase(arr[j])) {
                return false;
            }
            i++;
            j--;
        }
        return true;
    }
}

范文参考:

字符串算法——回文串验证的三大解题办法:双指针 & 新数组 & reverse函数 - 验证回文串 - 力扣(LeetCode)