LeetCode 125-验证回文串

153 阅读1分钟

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

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

 

示例 1:

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

示例 2:

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

提示:

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

思路 :双指针

初始时,左右指针分别指向 s 的两侧,随后我们不断地将这两个指针相向移动,每次移动一步,先判断指针指向的是字母或数字字符,如果是,就判断这两个指针指向的字符是否相同。当这两个指针相遇时,就说明字符串 s 是回文串

class Solution {
    public boolean isPalindrome(String s) {
        String c = s.toLowerCase();
        int i=0, j=c.length()-1;
        while(i<=j){
            while(!isValid(c.charAt(i)) && i<j){
                ++i;
            }
            while(!isValid(c.charAt(j)) && i<j){
                --j;
            }
            if(c.charAt(i) == c.charAt(j)){
                ++i;
                --j;
            }else{
                return false;
            }
            
        }
        return true;
    }

    //可替换Character.isLetterOrDigit
    private boolean isValid(char c){
        return (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9');
    }
}

复杂度分析

  • 时间复杂度:O(|s|),其中 ∣s∣ 是字符串 s 的长度。
  • 空间复杂度:O(1)。