面试算法18:有效的回文

题目

给定一个字符串,请判断它是不是回文。假设只需要考虑字母和数字字符,并忽略大小写。例如,"Was it a cat I saw?"是一个回文字符串,而"race a car"不是回文字符串。

分析

判断一个字符串是不是回文,常用的方法就是使用双指针。可以定义两个指针,一个指针从第1个字符开始从前向后移动,另一个指针从最后一个字符开始从后向前移动。如果两个指针指向的字符相同,则同时移动这两个指针以判断它们指向的下一个字符是否相同。这样一直移动下去,直到两个指针相遇。

由于题目要求只考虑字母和数字字符,如果某个指针指向的字符既不是字母也不是数字,则移动指针跳过该字符。同时,由于题目要求忽略大小写,因此需要把所有的字母都转化成小写形式(或大写形式)再做比较。

public class Test {
    public static void main(String[] args) {
        boolean result = isPalindrome("Was it a cat I saw");
        System.out.println(result);
    }

    public static boolean isPalindrome(String s) {
        int i = 0;
        int j = s.length() - 1;
        while (i < j) {
            char ch1 = s.charAt(i);
            char ch2 = s.charAt(j);
            if (!Character.isLetterOrDigit(ch1)) {
                i++;
            }
            else if (!Character.isLetterOrDigit(ch2)) {
                j--;
            }
            else {
                ch1 = Character.toLowerCase(ch1);
                ch2 = Character.toLowerCase(ch2);
                if (ch1 != ch2) {
                    return false;
                }

                i++;
                j--;
            }
        }

        return true;
    }
}

你可能感兴趣的:(算法,算法,面试,leetcode)