方法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特性,代码简洁但效率稍低。
- 字符数组:效率高,适合处理大字符串。