1. 题目描述
2. 解题思路
这应该是属于非常纯正的双指针题目了,用系统函数全部转为小写(当然大写也是可以的),一个指针从头开始,一个指针从后开始,排除非字母和数字后直接比较就完事了。没什么特别的,单纯记录一下吧。
3. 代码实现
3.1 双指针
public boolean isPalindrome(String s) {
s = s.toLowerCase();
int i = 0, j = s.length() - 1;
while (i < j) {
char l = s.charAt(i);
char r = s.charAt(j);
if ((l <= 'z' && l >= 'a') || (l <= 'Z' && l >= 'A') || (l <= '9' && l >= '0')) {
if ((r <= 'z' && r >= 'a') || (r <= 'Z' && r >= 'A') || (r <= '9' && r >= '0')) {
if (l == r) {
i++;
j--;
} else return false;
} else j--;
} else i++;
}
return true;
}
3.2 系统函数小对比
做完之后看了一下官解,居然还有Character.isLetterOrDigit()
这种系统函数,我大为震惊,于是再用这个代替了一下试试。最后的性能表现居然还比不上自己写的比较算法。
public boolean isPalindrome(String s) {
s = s.toLowerCase();
int i = 0, j = s.length() - 1;
while (i < j) {
char l = s.charAt(i);
char r = s.charAt(j);
if (Character.isLetterOrDigit(l)) {
if (Character.isLetterOrDigit(r)) {
if (l == r) {
i++;
j--;
} else return false;
} else j--;
} else i++;
}
return true;
}