LeetCode Top Interview Questions 125. Valid Palindrome (Java版; Easy)

welcome to my blog

LeetCode Top Interview Questions 125. Valid Palindrome (Java版; Easy)

题目描述
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

Note: For the purpose of this problem, we define empty string as valid palindrome.

Example 1:

Input: "A man, a plan, a canal: Panama"
Output: true
Example 2:

Input: "race a car"
Output: false
class Solution {
    public boolean isPalindrome(String s) {
        int n = s.length();
        if(n==0){
            return true;
        }
        s = s.toLowerCase();
        int i = 0, j = n-1;
        while(i<j){
            while(i<j && !(s.charAt(i)>='0' && s.charAt(i)<='9' || s.charAt(i)>='a' && s.charAt(i)<='z')){
                i++;
            }
            if(i==j){
                break;
            }
            while(i<j && !(s.charAt(j)>='0' && s.charAt(j)<='9' || s.charAt(j)>='a' && s.charAt(j)<='z')){
                j--;
            }
            if(i==j){
                break;
            }
            if(s.charAt(i)!=s.charAt(j)){
                return false;
            }
            //
            i++;
            j--;
        }
        return true;
    }
}
第一次做; 双指针法; 简洁版; 核心:在内循环中继续使用left<right这个约束, 从而保证了索引不会越界, 同时也满足了外循环的循环条件
class Solution {
    public boolean isPalindrome(String s) {
        if(s.isEmpty())
            return true;
        //
        s = s.toLowerCase();
        int left=0, right=s.length()-1;
        while(left<right){
            while(left<right && !Character.isLetterOrDigit(s.charAt(left))){
                left++;
            }
            while(left<right && !Character.isLetterOrDigit(s.charAt(right))){
                right--;
            }
            //here, left==right或者s.charAt(i)是letterOrDigit
            //下面这个if中可以不用加left<right这个条件,因为如果left==right,这是可以的
            if(left<right && s.charAt(left)!=s.charAt(right)){
                return false;
            }
            //update
            left++;
            right--;
        }
        return true;
    }
}
第一次做; 很容易想到双指针做法; 但是要注意特殊情况的处理:比如输入为空, 输入全是特殊字符, 这两种情况都要返回true; 处理逻辑不够简洁
class Solution {
    public boolean isPalindrome(String s) {
        if(s==null || s.length()==0)
            return true;
        int n=s.length();
        s = s.toLowerCase();
        int left=0, right=s.length()-1;
        char ch1 = s.charAt(left), ch2 = s.charAt(right);
        boolean res = true;
        while(left<right){
            while(!valid(ch1) && left+1<n){
                ch1=s.charAt(++left);
            }
            while(!valid(ch2) && right-1>=0){
                ch2=s.charAt(--right);
            }
            if(!valid(ch1) && !valid(ch2)){
                continue;
            }
            if(ch1!=ch2){
                res = false;
                break;
            }
            //update
            if(left==n-1 || right==0)
                break;
            ch1 = s.charAt(++left);
            ch2 = s.charAt(--right);
        }
        return res;
    }
    public boolean valid(char ch){
        return (ch>='0'&&ch<='9')||(ch>='a'&&ch<='z');
    }
}
力扣优秀题解; 巧妙地地方:在两个内循环中接着使用了i<j的限制, 这样i和j都不会出现越界的情况, 我没想到这一点, 所以写的非常臃肿
class Solution {
    public boolean isPalindrome(String s) {
        int i = 0, j = s.length() - 1;
        while(i < j){
            while(i < j && !Character.isLetterOrDigit(s.charAt(i))) i++;
            while(i < j && !Character.isLetterOrDigit(s.charAt(j))) j--;
            if(Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(j))) return false;
            i++; j--;
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值