题目:
题解:
1. 题解一:正则表达式
我们还可以使用正则匹配,把特殊字符过滤掉,只留下字母和数字,然后转化为小写,再反转,最后在判断是否相等。当然这种写法只是提供了一种思路,面试中如果写出这种肯定还会让你再写一种的,因为它没有完全考察出对这题的解题思路。
2. 题解二:双指针中的左右指针
最简单的就是使用双指针,一个指向前,一个指向后,遇到空格以及特殊字符要跳过,然后判断。
代码:
1. 代码一:正则表达式
// 方法1: 正则表达式
public static boolean isPalindrome(String s) {
String actual = s.replaceAll("[^A-Za-z0-9]", "").toLowerCase();
String rev = new StringBuilder(actual).reverse().toString();
return actual.equals(rev);
}
2. 代码二:双指针中的左右指针
public class code125 {
// 方法2: 双指针中的左右指针
public static boolean isPalindrome(String s) {
if(s.isEmpty())
{
return true;
}
// 从头到尾一一比较即可,遇到除字母和数字字符的字符跳过
int left = 0;
int right = s.length() - 1;
while(left < right)
{
while(left < right && !Character.isLetterOrDigit(s.charAt(left)))
{
left++;
}
while(left < right && !Character.isLetterOrDigit(s.charAt(right)))
{
right--;
}
if(Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right)))
{
return false;
}
left++;
right--;
}
return true;
}
public static void main(String[] args) {
String s1 = "A man, a plan, a canal: Panama";
boolean res1 = isPalindrome(s1);
System.out.println(res1);
String s2 = "race a car";
boolean res2 = isPalindrome(s2);
System.out.println(res2);
}
}