给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama" 输出: true 解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car" 输出: false 解释:"raceacar" 不是回文串
本题需要用到的知识:
1.java.lang.String.charAt() 方法返回指定索引处的char值。索引范围是从0到length() - 1。
2.toLowerCase() 将一个大写字符转为小写字母
3.isLetterOrDigit() 判断是否是一个字母或者数字
1.双指针法
(回文的意思是顺序逆序都一样)先将字符串所有的字符都变成小写字母,头部指向一个指针,尾部指向一个指针,并进行字符判断,遇到除字符以外的就跳过直到遇到字符为止最后进行头尾字符判断。
class Solution {
public boolean isPalindrome(String s) {
if(s==null||s.length()==0)
return true;
s=s.toLowerCase();//把字母都变成大写
for(int i=0,j=s.length()-1;i<j;i++,j--){
//去掉除了字母之外的
while(i<j&&!Character.isLetterOrDigit(s.charAt(i)))
i++;
while(i<j&&!Character.isLetterOrDigit(s.charAt(j)))
j--;
//判断头尾两个字符是否相同
if(s.charAt(i)!=s.charAt(j))
return false;
}
return true;
}
}
2.递归
class Solution {
public boolean isPalindrome(String s) {
return isPalindromeHelper(s,0,s.length()-1);
}
public boolean isPalindromeHelper(String s,int left,int right){
if(left>=right)
return true;
s=s.toLowerCase();
while(left<right&&!Character.isLetterOrDigit(s.charAt(left)));
left++;
while(left<right&&!Character.isLetterOrDigit(s.charAt(right)));
right--;
return s.charAt(left)==s.charAt(right)&&isPalindromeHelper(s,++left,--right);
}
}