算法------验证回文串

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

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

     示例 1:

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

     输入: "race a car"
     输出: false

这个算法,我写的第一遍是39ms, 后来看到别人的优化点,写到了4-6ms

算法是一个不断优化的过程,也是一个不断学习进步的过程。算法是一个很好玩的过程。

第一遍:

class Solution {
    public boolean isPalindrome(String s) {
        String string = s.replaceAll(" ", "");
        int length = string.length();
        if (length == 0 || length == 1) {
            return true;
        }
        for (int i = 0,j =length-1; j > 0 && j>i;) {
            char headChar = string.charAt(i);
            if (!Character.isDigit(headChar) &&  !Character.isAlphabetic(headChar)) {
                i++;
                continue;
            }

            char endChar = string.charAt(j);
            if (!Character.isDigit(endChar) &&  !Character.isAlphabetic(endChar)) {
                j--;
                continue;
            }
            if (headChar != endChar && (Character.isLowerCase(headChar)? Character.toUpperCase(headChar) : Character.toLowerCase(headChar)) != endChar) {
                return false;
            }else {
                i++;
                j--;
            }

        }
        return true;

    }

}

第四遍:

public static boolean isPalindrome(String s) {
int length = s.length();
        if (length == 0 || length == 1) {
            return true;
        }
        for (int i = 0,j =length-1; j>i;) {
            char headChar = s.charAt(i);
            if (headChar >= 'A' && headChar<= 'Z'){//抓换成小写
                headChar +=32;
            }else if (! ((headChar >= 'a' && headChar<= 'z')  || (headChar >= '0' && headChar<='9'))){
                i++;
                continue;
            }


            char endChar = s.charAt(j);
            if (endChar >= 'A' && endChar<= 'Z'){//抓换成小写
                endChar +=32;
            }else if (! ((endChar >= 'a' && endChar<= 'z')  || (endChar >= '0' && endChar<='9'))){
                j--;
                continue;
            }

            if (headChar != endChar ) {
                return false;
            }else {
                i++;
                j--;
            }

        }
        return true;
        }

网上最优的算:

class Solution {
    public boolean isPalindrome(String s) {
        if(s == null || s.length() == 0){
            return true;
        }
        char[] copy = s.toCharArray();
        char[] letterAndNums = new char[copy.length];
        int index = 0;
        for(int i = 0; i < copy.length; i++){
            if((copy[i] >= 'a' && copy[i] <= 'z')||(copy[i] >= '0' && copy[i] <= '9')){
                letterAndNums[index++] = copy[i];
            }else if((copy[i] >= 'A' && copy[i] <= 'Z')){
                letterAndNums[index++] = (char)(copy[i] + 32);
            }
        }
        letterAndNums = Arrays.copyOfRange(letterAndNums, 0, index);
        int start = 0, end = letterAndNums.length - 1;
        while(start < end){
            if(letterAndNums[start++] != letterAndNums[end--]){
                return false;
            }
        }
        return true;
    }
}

加油!

原文地址:https://www.cnblogs.com/caoxinyu/p/10568512.html