一、题目:给定一个字符串,判断其是否为回文字符串:
二、举例:
回文字符串是指一个字符串正读和反读都一样的字符串。例如,“level”、“radar”和“noon”都是回文字符串,因为它们从前往后读和从后往前读都是一样的
在Java中,有多种方法可以判断一个字符串是否为回文字符串。以下是一些不同的实现思路:
三、方法1:使用字符串反转
最直接的方法是将字符串反转,然后与原字符串比较。
public static boolean isPalindrome(String str) {
String cleanStr = str.replaceAll("\\s+", "").toLowerCase();
String reversedStr = new StringBuilder(cleanStr).reverse().toString();
return cleanStr.equals(reversedStr);
}
四、方法2:双指针法
使用两个指针,一个从字符串的开始向后移动,另一个从字符串的末尾向前移动,比较两个指针指向的字符是否相同。
public static boolean isPalindrome(String str) {
int left = 0, right = str.length() - 1;
while (left < right) {
while (left < right && !Character.isLetterOrDigit(str.charAt(left))) {
left++;
}
while (left < right && !Character.isLetterOrDigit(str.charAt(right))) {
right--;
}
if (Character.toLowerCase(str.charAt(left)) != Character.toLowerCase(str.charAt(right))) {
return false;
}
left++;
right--;
}
return true;
}
五、方法3:递归
递归地比较字符串的首尾字符,然后对中间的字符串进行递归判断。
public static boolean isPalindrome(String str) {
if (str == null || str.isEmpty()) {
return true;
}
str = str.replaceAll("\\s+", "").toLowerCase();
if (str.length() < 2) {
return true;
}
if (str.charAt(0) != str.charAt(str.length() - 1)) {
return false;
}
return isPalindrome(str.substring(1, str.length() - 1));
}
九、总结
这些方法各有优缺点,可以根据实际情况选择最适合的方法。例如,对于非常长的字符串,使用双指针法可能更高效,因为它避免了额外的字符串复制和反转操作。而对于较短的字符串,递归方法可能更简洁。