[leetcode]Valid Palindrome

题目描述如下:

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

For example,

“A man, a plan, a canal: Panama” is a palindrome.

“race a car” is not a palindrome.

因为是Easy题,所以第一遍代码根本没怎么想:

public class Solution {
     public boolean isPalindrome(String s) {
        if(s.length == 0) return true;
        String tmpStr = changeStr(s);
        return judgeStr(tmpStr);
    }

    public String changeStr(String s){
        String res = "";
        int len = s.length(), i;
        for(i = 0; i < len; i++){
            char ch = s.charAt(i);
            if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')){
                res = res + ch;
            }
        }
        return res.toLowerCase();
    }

    public boolean judgeStr(String s){
        boolean flag = true;
        int len = s.length(), i;
        for(i = 0; i < len / 2; i++){
            if(s.charAt(i) != s.charAt(len - 1 - i)){
                flag = false;
                break;
            }
        }
        return flag;
    }
}

然后在最后一个极暴力的测试数据面前TLE了。

既然这样那就是只能对字符串进行一遍扫描,最常用的就是双指针法,注意一下这里数字也是有效字母

public class Solution {
       public boolean isPalindrome(String s) {
        return judgeStr(s);
    }

    public boolean judgeStr(String s){
        if(s.length() == 0) return true;
        char preLetter, lastLetter;
        int i = 0, j = s.length() - 1;
        while(i < j){
            while(!isLetter(s.charAt(i)) && i < j) i ++;
            while(!isLetter(s.charAt(j)) && i < j) j --;
            if(i >= j) break;  
            preLetter = s.charAt(i);
            lastLetter = s.charAt(j);
            if(lowerCase(preLetter) != lowerCase(lastLetter)) return false;  
            else {  
                i ++;  
                j --;  
            }  
        }  
        return true; 
    }

    public boolean isLetter(char ch){
        return ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z'
                || ch >= '0' && ch <= '9'; 
    }

    public char lowerCase(char ch){
        if(ch >= 'A' && ch <= 'Z') return (char)(ch + 'a' - 'A');  
        else return ch;
    }
}

题目链接:https://leetcode.com/problems/valid-palindrome/

你可能感兴趣的:(LeetCode)