题目:

给定一个字符串,判断其是否为一个回文串。只包含字母和数字,忽略大小写。

样例

"A man, a plan, a canal: Panama" 是一个回文。

"race a car" 不是一个回文。

注意

你是否考虑过,字符串有可能是空字符串?这是面试过程中,面试官常常会问的问题。

在这个题目中,我们将空字符串判定为有效回文。

挑战

O(n) 时间复杂度,且不占用额外空间。

解题:

去除非有效字符后,整体是个回文串,两边查找,利用快速排序的思想,通过while找到有效的字符串

Java程序:

public class Solution {
    /**
     * @param s A string
     * @return Whether the string is a valid palindrome
     */
    public boolean isPalindrome(String s) {
        // Write your code here
        if(s.equals("")) return true;
        int len = s.length();
        int left = 0;
        int right = len - 1;
        s = s.toLowerCase();
        while(left < right){
            char leftchar = s.charAt( left );
            char rightchar = s.charAt( right );
            while(!isValid(leftchar)){
                left ++;
                leftchar = s.charAt( left );
                if(left>=right) return true;
            }
            while(!isValid(rightchar)){
                right --;
                rightchar = s.charAt( right );
                if(right<=left) return true;
            }
            if(leftchar != rightchar)
                return false;
            left ++;
            right --;
        }
        
        return true;

    }
    public boolean isValid(char ch){
        if(ch>='a' && ch <= 'z')
            return true;
        if(ch >='0' && ch <= '9')
            return true;
        return false;
    }
}
View Code

相关文章: