125. 验证回文串(LeetCode)

题目描述


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

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

示例 1:

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

条件分析


  1. 回文串是指对称的字符串;
  2. 只需要考虑字母和数字,忽略大小写;
  3. 空字符串为有效回文串;

解题思路(指针对撞)


  1. 定义两个指针left和right分别指向字符串的首尾,如果不相等,则不是(快速失败),否则一直比较到两个指针相遇(说明是回文串)
  2. 要快速跳过无效字符和比较是否相等,可考虑使用字符的ascii码来进行判断;

编码如下


public boolean isPalindrome(String s) {
    char[] charArray = s.toCharArray();
    int left = 0;
    int right = charArray.length-1;
    char leftChar,rightChar;
    while(left<right) {
        leftChar = charArray[left];
        if(!isLetterOrDigit(leftChar)) {
            left++;
            continue;
        }
        rightChar = charArray[right];
        if(!isLetterOrDigit(rightChar)) {
            right--;
            continue;
        }
        int substract = leftChar - rightChar;
        if (isDigit(leftChar) || isDigit(rightChar)) {
            if (substract != 0) {
                return false;
            }
        }
        if (substract != 0 && substract != 32 && substract != -32) {
            return false;
        }
        left++;
        right--;
    }
    return true;
}

public boolean isDigit(char c) {
    return c>='0' && c<='9';
}

public boolean isLetterOrDigit(char c) {
    return isDigit(c) || (c>='a' && c<='z') || (c>='A' && c<='Z');
} 
posted @ 2021-07-08 16:15  咸与维新  阅读(45)  评论(0)    收藏  举报