Leetcode125-判断回文串

回文串是一个典型的问题,比如abccba12345654321都是回文串。设计的基本思路普通都是从两端向中间遍历,比较相等,在最中间位置停止。在这个题目leetcode125中,对回文串进行了扩展,对字串中的空格,以及其他符号忽略,只要有效字符符合回文,则认为是回文串,如abc***cb a,。在这种情况下,如果我们从正面来考虑,除了这些字符,还有汉字等情况,感觉会比较麻烦。其实可以反向的思路来解答,考虑从两边遍历,在头尾分别记录标志位,如果是非有效字符,就忽略,是尾部,后标志位前移;是头部,前标志位后移;是有效字符,进行比较,如果不等肯定不是回文串,退出,相等比较下一位,标志位都往中间;同时注意截止条件,是头尾标志位相等。
如下是题目和代码,也比较简单,容易理解,注意代码中考虑了中文、全角和半角符号的情况:

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
Note: For the purpose of this problem, we define empty string as valid palindrome.
Example 1:
Input: "A man, a plan, a canal: Panama"
Output: true
Example 2:
Input: "race a car"
Output: false

public class Leet125 {
    public static void main(String[] args) {
        String[] strings = new String[] { "", "f", "ff", "f4", "fxf,,,", "fx:xf", "fxx", "abcdefg,fe dcba","回文回文。。回文回文" };
        for (String s : strings) {
            System.out.println(isPalindrome(s));
        }
    }

    public static final String ignores = " ~!@#$%^&*()_+=-`[]\\;',./<>?:\"|}{·,。、;''【】、=-~!@#¥%……&*()——+";
    public static boolean isPalindrome(String s) {
        if (null == s) {
            return false;
        }

        s = s.toLowerCase();

        if (s.length() <= 1) {
            return true;
        }

        int j = s.length() - 1;
        int i = 0;
        while (i <= j && j>0) {
            char start = s.charAt(i);
            char end = s.charAt(j);

            if (ignores.contains("" + start)) {
                i++;
                continue;
            }

            if (ignores.contains("" + end)) {
                j--;
                continue;
            }

            if (s.charAt(i) != s.charAt(j)) {
                return false;
            }
            i++;
            j--;
        }
        return true;
    }
}

你可能感兴趣的:(Leetcode125-判断回文串)