回文字符串判断是面试和笔试中常见的面试题之一,同时也是 LeetCode 中一道经典的面试题。

回文串定义

“回文串”是一个正读和反读都一样的字符串,初始化标志flag=true,比如“level”或者“noon”等等就是回文串。

回文字符串判断的3种方法

1、java中使用内置函数反转判断

回文字符串最简单的实现方式就是将字符串进行反转之后再与原字符串进行判断,假如二者相同的话则证明为回文字符串,我们可以借助 StringBuilder 来实现,实现代码如下:

public class Plalindrome {
    public static void main(String[] args) {
        System.out.println(isPlalindrome_1("12321"));
        System.out.println(isPlalindrome_1("1231"));
        System.out.println(isPlalindrome_1("123321"));
    }
    
    /**
     * 借助内置函数反转实现回文字符串判断
     * @param str 待判断字符串
     * @return
     */
    private static boolean isPlalindrome_1(String str) {
        StringBuilder sb = new StringBuilder(str);
        sb.reverse();
        return sb.toString().equals(str);
    }
}

程序的执行结果为:

true
false
true

当然,除了可以使用 StringBuilder 之外,我们也可以使用 StringBuffer 来实现,实现代码都是相同的,我们这里就不再赘述。

2、使用方法循环调用实现

我们可以初始化两个指针 low 和 high,让它们分别指向字符串的第一个字符和最后一个字符,每次判断两个指针指向的字符是否相同,如果相同,则更新指针,是 low = low+1 和 high = high-1,然后判断再进行判断,当所有循环到最中间时二者还相同,则证明是回文字符串,如下图所示:

Java字符串回文判断 java 判断回文串_leetcode

public class Plalindrome {
    public static void main(String[] args) {
        String str = "12321";
        String str2 = "1231";
        String str3 = "123321";
        System.out.println(isPlalindrome_2(str, 0, str.length() - 1));
        System.out.println(isPlalindrome_2(str2, 0, str2.length() - 1));
        System.out.println(isPlalindrome_2(str3, 0, str3.length() - 1));
    }
    
    /**
     * 用方法循环调用实现
     * @param str  待对比字符串
     * @param low  前面字符的下标
     * @param high 后面字符的下标
     * @return
     */
    private static boolean isPlalindrome_2(String str, int low, int high) {
        if (high == 0 || high == 1) {
            return true;
        } else {
            char c1 = str.charAt(low), c2 = str.charAt(high);
            if (c1 == c2) { // 字符对比相等
                return isPlalindrome_2(str, low + 1, high - 1);
            } else { // 字符对比不相等
                return false;
            }
        }
    }
}

程序的执行结果为:

true
false
true

3、使用 for 循环判断

使用 for 循环判断的方式和上一种实现思路类似,是将字符串分隔成两半,先对比第一位和最后一位是否相等,如果相等进行下一次循环,每次给首位+1 和末尾-1,然后再进行判断,在整个循环过程中如果有一次不相等就里面返回 false,如果整个循环能顺利执行完则说明是回文字符串,直接返回 true 即可,实现代码如下:

public class Plalindrome {
    public static void main(String[] args) {
        String str = "12321";
        String str2 = "1231";
        String str3 = "123321";
        System.out.println(isPlalindrome_3(str));
        System.out.println(isPlalindrome_3(str2));
        System.out.println(isPlalindrome_3(str3));
    }
    
    /**
     * 用 for 循环判断
     * @param str 待对比字符串
     * @return
     */
    private static boolean isPlalindrome_3(String str) {
        char[] chars = str.toCharArray();
        int maxSize = chars.length / 2; // 循环比较次数
        for (int i = 0; i < maxSize; i++) {
            if (chars[i] != chars[chars.length - 1 - i]) {
                // 最前面的和最后的依次对比,如果有一个不相同,则返回 false
                return false;
            }
        }
        return true;
    }
}

程序的执行结果为:

true
false
true

当然,除了以上 3 种实现方法之外,我们还可以有更多判断的方法,比如将字符串倒序之后组成一个新的字符串,再将新老字符串进行比较,或者直接使用StringBuffer 的 reverse 来实现等。