问题描述
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases. For example, “A man, a plan, a canal: Panama” is a palindrome. “race a car” is not a palindrome. Note: Have you consider that the string might be empty? This is a good question to ask during an interview. For the purpose of this problem, we define empty string as valid palindrome. 地址
问题分析
对一个字符串,只考虑字母与数字,并且字母忽略大小写,看是否是回文。 方法1:双指针(对撞指针) 方法2:正则表达式 + StringBuffer 的 reverse()函数(面试中不推荐)
经验教训
Character.isLetterOrDigit(ch)
函数:检验一个字符是否是字母或者数字Character.toLowerCase(ch)
函数:将大写字符转换为小写,若其他字符,不变相应的,有Character.toUpperCase(ch)
函数 ,String 类也有该方法 Character.isLowerCase(ch)
:检验一个字符是否小写双指针(对撞指针)技巧(两种实现) 正则表达式
代码实现
public boolean isPalindrome(String s) {
if (s == null ) {
return false ;
}
int length = s.length();
if (length <= 1 ) {
return true ;
}
char[] chs = s.toCharArray();
int left = 0 ;
int right = length - 1 ;
while (left < right ) {
while (left < right && ! Character.isLetterOrDigit(chs[left ])) {
++left ;
}
while (left < right && ! Character.isLetterOrDigit(chs[right ])) {
--right ;
}
if (left < right && Character.toLowerCase(chs[left ]) != Character.toLowerCase(chs[right ])) {
return false ;
}
left ++;
right --;
}
return true ;
}
双指针做法2(if else)(摘自 dicuss)
public boolean isPalindrome (String s) {
char [] c = s.toCharArray();
for (int i = 0 , j = c.length - 1 ; i < j; ) {
if (!Character.isLetterOrDigit(c[i])) i++;
else if (!Character.isLetterOrDigit(c[j])) j--;
else if (Character.toLowerCase(c[i++]) != Character.toLowerCase(c[j--]))
return false ;
}
return true ;
}
public class Solution {
public boolean isPalindrome (String s) {
String actual = s.replaceAll("[^A-Za-z0-9]" , "" ).toLowerCase();
String rev = new StringBuffer(actual).reverse().toString();
return actual.equals(rev);
}
}