```
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
```
>这题学到一个新方法 Character.isLetterOrDigit()
java.lang.Character.isLetterOrDigit(char ch) 确定指定的字符是否为字母或数字。
java.lang.Character.isLetter(char ch) 确定指定的字符是字母。
```
/**
* 125. 验证回文串
* @Author: lixj
* @Date: 2020/9/21 11:08
*/
public class ValidPalindrome {
/**
* 拼接新字符串再判断,双指针法
* @param s
* @return
*/
public boolean isPalindrome(String s) {
char[] ch = s.toCharArray();
int len = s.length();
if (len == 0) return true;
StringBuilder sb = new StringBuilder();
for (int i = 0; i <= len -1; i++) {
if (Character.isLetterOrDigit(ch[i])) {
sb.append(ch[i]);
}
}
int left = 0;
int right = sb.length() -1;
char[] chnew = sb.toString().toLowerCase().toCharArray();
while (left < right) {
if (chnew[left] != chnew[right]) {
return false;
}
left++;
right--;
}
return true;
}
/**
* 原字符串判断
* @param s
* @return
*/
public boolean isPalindrome1(String s) {
int left = 0;
int right = s.length() -1;
while (left < right) {
while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
++left;
}
while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
--right;
}
if (left < right) {
if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {
return false;
}
}
++left;
--right;
}
return true;
}
public static void main(String[] args) {
String srt = "A man, a plan, a canal: Panama";
// String srt = "A man, a plan, a canal: vnama";
ValidPalindrome validPalindrome = new ValidPalindrome();
System.out.println(validPalindrome.isPalindrome1(srt));
}
}
```

LeetCode 进阶之路 - 125.验证回文串