给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 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); } }