欢迎访问宙启技术站
智能推送

判断一个字符串是否是回文字符串的Java函数实现方法?

发布时间:2023-06-10 09:08:06

回文字符串是指一个字符串正反顺序扫描得到的结果是相同的,例如"level"或者"racecar"即是回文字符串。判断一个字符串是否是回文字符串的方法有很多种,下面介绍几种常见的实现方式。

方法1:双指针法

双指针法是一种常见的判断回文字符串的方法。先定义两个指针i和j,分别指向字符串的头和尾,然后向中间逐一比较对应位置的字符是否相同,如图:

![image](https://user-images.githubusercontent.com/87184499/137103424-deb68f15-8c71-4dd4-b29f-8bf948e705fa.png)

Java代码实现如下:

public static boolean isPalindrome(String s) {
    if (s == null || s.equals("")) {
        return true;
    }
    s = s.toLowerCase(); // 不区分大小写
    int i = 0, j = s.length() - 1; // 定义双指针
    while (i < j) {
        while (i < j && !Character.isLetterOrDigit(s.charAt(i))) { // 跳过非字母和数字
            i++;
        }
        while (i < j && !Character.isLetterOrDigit(s.charAt(j))) {
            j--;
        }
        if (s.charAt(i) != s.charAt(j)) {
            return false;
        }
        i++;
        j--;
    }
    return true;
}

方法2:利用StringBuilder反转

另一种方式是利用Java中的StringBuilder类。将原字符串反转,如果反转后得到的字符串与原字符串相等,则该字符串是回文字符串。Java代码实现如下:

public static boolean isPalindrome(String s) {
    if (s == null || s.equals("")) {
        return true;
    }
    s = s.toLowerCase(); // 不区分大小写
    StringBuilder sb = new StringBuilder(s);
    sb.reverse(); // 反转字符串
    return s.equals(sb.toString()); // 判断是否相等
}

方法3:利用栈

利用栈判断一个字符串是否是回文字符串也是一种常见的方法。将字符串的每一个字符依次压入栈中,然后再依次弹出并连接成一个新的字符串,如果新的字符串与原字符串相等,则该字符串是回文字符串。Java代码实现如下:

public static boolean isPalindrome(String s) {
    if (s == null || s.equals("")) {
        return true;
    }
    s = s.toLowerCase(); // 不区分大小写
    Stack<Character> stack = new Stack<>();
    for (char c : s.toCharArray()) {
        if (Character.isLetterOrDigit(c)) { // 只压入字母和数字
            stack.push(c);
        }
    }
    StringBuilder sb = new StringBuilder();
    while (!stack.isEmpty()) {
        sb.append(stack.pop());
    }
    return s.equals(sb.toString());
}

方法4:递归

递归方法也可以用来判断一个字符串是否是回文字符串。对于一个字符串,如果它的第一个字符和最后一个字符相等,并且剩余的字符串也是回文字符串,则该字符串是回文字符串。Java代码实现如下:

public static boolean isPalindrome(String s) {
    if (s == null || s.equals("")) {
        return true;
    }
    s = s.toLowerCase(); // 不区分大小写
    return isPalindromeHelper(s, 0, s.length() - 1);
}

private static boolean isPalindromeHelper(String s, int start, int end) {
    if (start >= end) {
        return true;
    }
    char c1 = s.charAt(start), c2 = s.charAt(end);
    if (!Character.isLetterOrDigit(c1)) {
        return isPalindromeHelper(s, start + 1, end);
    } else if (!Character.isLetterOrDigit(c2)) {
        return isPalindromeHelper(s, start, end - 1);
    } else if (Character.toLowerCase(c1) != Character.toLowerCase(c2)) {
        return false;
    } else {
        return isPalindromeHelper(s, start + 1, end - 1);
    }
}

以上是判断一个字符串是否是回文字符串的一些常用方法,不同方法的时间和空间复杂度也有所不同。在实际应用中,需要根据具体场景选择合适的方法。