LeetCode 125. 验证回文串 && 680. 验证回文字符串 Ⅱ

125题:https://leetcode-cn.com/problems/valid-palindrome/

这个题就是一个很标准的验证回文字符串,但是这个字符串又有点不一样,它有数字,有大写,有小写,甚至还有空格和非数字字符,根据题目意思,空格,非数字符号是不会被纳入评价范围的,同时判定的时候也不区分大小写。所以我们首先先把字符串统一转成大写或者是小写,然后去除空格。在双指针判断的时候遇到 小于‘0’ 或者 大于‘9’且小于‘a’ 或者大于'z’的情况下要直接将这边+1,寻找下一个位置。代码如下

class Solution {
    public boolean isPalindrome(String s) {
        if(s.length() == 0){
            return true;
        }
        s = s.toLowerCase();
        s = s.replaceAll(" ","");
        int left = 0;
        int right = s.length()-1;
        while(left < right){
            if(s.charAt(left) < '0' || (s.charAt(left) > '9' && s.charAt(left) < 'a') || s.charAt(left) > 'z'){
                left++;
                continue;
            }
            if(s.charAt(right) < '0' || (s.charAt(right) > '9' && s.charAt(right) < 'a') || s.charAt(right) > 'z'){
                right--;
                continue;
            }
            if(s.charAt(left) != s.charAt(right)){
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}
执行用时 :18 ms, 在所有 Java 提交中击败了20.09%的用户
内存消耗 :40.2 MB, 在所有 Java 提交中击败了7.14%的用户
 
2020年6月19日更新
class Solution {
    public boolean isPalindrome(String s) {
        char[] str = s.toLowerCase().toCharArray();
        int left = 0;
        int right = str.length-1;
        while(left < right){
            if(str[left] < '0' || (str[left] > '9' && str[left] < 'a') || str[left] >'z'){
                left++;
            }else if(str[right] < '0' || (str[right] > '9' && str[right] < 'a') || str[right] >'z'){
                right--;
            }else if(str[left] != str[right]){
                return false;
            }else{
                left++;
                right--;
            }
        }
        return true;
    }
}

同样的思想,没想到一个月后的今天又遇到了这个题 哈哈,秒杀了。但是这次的击败的人数多了。

执行用时:3 ms, 在所有 Java 提交中击败了93.04%的用户
内存消耗:39.8 MB, 在所有 Java 提交中击败了7.14%的用户
 
 
这个是2020年5月19日的每日一题,这个题关键在于怎么利用只能删除一个的条件,我们设定i为左边指针,j为右边指针,如果s.charAt(i) != s.charAt(j)的时候,我们需要去分别判定[i,j-1]和[i+1,j]这两个字符串中是否有一个是回文,如果是就直接返回true,否则返回false。
最终解出来的答案还可以,代码如下
class Solution {
    public boolean validPalindrome(String s) {
        int left = 0;
        int right = s.length()-1;
        while(left < right){
            if(s.charAt(left) != s.charAt(right)){
                return check(s,left+1,right) || check(s,left,right-1);
            }else{
                left++;
                right--;
            }
        }
        return true;
    }

    private boolean check(String s,int l, int r){
        int left = l;
        int right = r;
        while(left < right){
            if(s.charAt(left) != s.charAt(right)){
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}
执行用时 :8 ms, 在所有 Java 提交中击败了89.55%的用户
内存消耗 :40.1 MB, 在所有 Java 提交中击败了6.67%的用户
原文地址:https://www.cnblogs.com/ZJPaang/p/12915372.html