关于Palindrome的问题,一般可以用两类解法,第一类是使用Stack反向存储内容,然后再和正向的比较;第二类是使用两个指针,一开始一个设置在开头,一个设置在尾部,依次进行比较。这道题目另外有些要求,就是如不不是数字或字母的话就跳过,所以正好可以使用Java内置的Character.isLetterOrDigit()函数进行判断,如果不是的话则head++/tail--,但是注意在这种情况下要使用continue跳出循环而不是继续比较,因为可能连续的非数字或字母存在,在这种情况下如果继续比较的话会出现错误。另外由于这道题目要求的是不顾大小写,所以在比较前要使用Character.toLowerCase()转换成小写的进行比较。时间复杂度为O(n),代码如下:
public class Solution {
public boolean isPalindrome(String s) {
if(s.isEmpty()) return true;
int head = 0;
int tail = s.length() - 1;
int cHead;
int cTail;
while(head < tail){
cHead = s.charAt(head);
cTail = s.charAt(tail);
if(!Character.isLetterOrDigit(cHead)){
head++;
continue;
}
if(!Character.isLetterOrDigit(cTail)){
tail--;
continue;
}
if(Character.toLowerCase(cHead) != Character.toLowerCase(cTail)) return false;
head++;
tail--;
}
return true;
}
}
知识点:
1. Palindrome问题的两类解法:使用Stack或者双指针
2. 记住Java中一些常用的处理char的方法,Character.isLetterOrDigit(), Character.toLowerCase(), Character.toUpperCase()