判断一个字符串是否为对称字符串(回文字符串)

方法1:使用双指针

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        if (str == null) return false;

        int left = 0; // 左指针
        int right = str.length() - 1; // 右指针

        while (left < right) {
            if (str.charAt(left) != str.charAt(right)) {
                return false; // 如果左右字符不相等,返回false
            }
            left++;
            right--;
        }
        return true; // 如果所有字符都匹配,返回true
    }

    public static void main(String[] args) {
        String str = "12321";
        System.out.println("Is \"" + str + "\" a palindrome? " + isPalindrome(str));
    }
}

方法2:反转字符串

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        if (str == null) return false;

        String reversed = new StringBuilder(str).reverse().toString();
        return str.equals(reversed); // 比较原字符串和反转后的字符串
    }

    public static void main(String[] args) {
        String str = "12321";
        System.out.println("Is \"" + str + "\" a palindrome? " + isPalindrome(str));
    }
}

方法3:递归实现

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        if (str == null) return false;
        return isPalindromeHelper(str, 0, str.length() - 1);
    }

    private static boolean isPalindromeHelper(String str, int left, int right) {
        // 递归终止条件
        if (left >= right) return true;

        // 如果左右字符不相等,返回false
        if (str.charAt(left) != str.charAt(right)) return false;

        // 递归检查下一对字符
        return isPalindromeHelper(str, left + 1, right - 1);
    }

    public static void main(String[] args) {
        String str = "12321";
        System.out.println("Is \"" + str + "\" a palindrome? " + isPalindrome(str));
    }
}

方法4:使用Java 8 Stream

import java.util.stream.IntStream;

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        if (str == null) return false;

        return IntStream.range(0, str.length() / 2)
                        .noneMatch(i -> str.charAt(i) != str.charAt(str.length() - 1 - i));
    }

    public static void main(String[] args) {
        String str = "12321";
        System.out.println("Is \"" + str + "\" a palindrome? " + isPalindrome(str));
    }
}

方法5:字符数组

public class PalindromeChecker {
    public static boolean isPalindrome(String str) {
        if (str == null) return false;

        char[] chars = str.toCharArray();
        int left = 0;
        int right = chars.length - 1;

        while (left < right) {
            if (chars[left] != chars[right]) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }

    public static void main(String[] args) {
        String str = "12321";
        System.out.println("Is \"" + str + "\" a palindrome? " + isPalindrome(str));
    }
}

运行结果

对于输入字符串 "12321",上述方法都会输出:

Is "12321" a palindrome? true

总结

以上方法各有优缺点:

  • 双指针:效率高,时间复杂度为O(n),空间复杂度为O(1)。
  • 反转字符串:实现简单,但需要额外的字符串存储。
  • 递归:代码简洁,但递归深度可能受限。
  • Stream:利用Java 8特性,代码简洁但效率稍低。
  • 字符数组:效率高,适合处理大字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值