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

回文字符串判断是面试和笔试中常见的面试题之一,同时也是 LeetCode 中一道经典的面试题,那么本文我们就来看一下什么是回文字符串?以及如何实现回文字符串的判断。

回文字符串定义

回文字符串是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文字符串。(来自百度百科)

举个例子,比如以下字符串就为回文字符串:

回文字符串判断的3种方法_第1张图片

 

回文字符串判断的3种方法_第2张图片

 

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

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

回文字符串最简单的实现方式就是将字符串进行反转之后再与原字符串进行判断,假如二者相同的话则证明为回文字符串,我们可以借助 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,然后判断再进行判断,当所有循环到最中间时二者还相同,则证明是回文字符串,如下图所示:

回文字符串判断的3种方法_第3张图片

 

实现代码如下:

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 来实现等。

回文字符串判断的意义

回文字符串判断的意义,我能想到的就是“面试”了,因为在实际的生活中真的很难找到它的实际应用,这就好像游戏和玩具对人的“意义”一样,它有什么意义呢?其实“面试”一条也就够了吧。

总结

回文字符串可以使用内置反转字符串或者递归的方式进行对比,但如果是实际的面试中,我推荐使用第 3 种方式来实现,因为它更原始、需要的依赖也更少,我们并不需要借助 JDK 自身的 API 就可以实现,并且它的实现代码也很简单易懂。

你还有更好的解决方案吗?欢迎评论区补充留言~

你可能感兴趣的:(回文字符串判断的3种方法)