给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama" 输出: true
示例 2:
输入: "race a car" 输出: false
思路:验证回文字符串,使用两个指针,一个指针从头开始自加,一个指针从尾开始自减,如果 i > j 了,退出循环,返回 true,否则返回 false。但要注意字符串大小写的情况,此时要将字符转为小写。
class Solution {
public boolean isPalindrome(String s) {
String s1 = s.toLowerCase();
List<Character> list = new ArrayList<>();
for(int i =0;i < s1.length();i++) {
if((s1.charAt(i) <= 'z' && s1.charAt(i) >= 'a') || (s1.charAt(i) >='0' && s1.charAt(i)<='9')) {
list.add(s1.charAt(i));
}
}
int i = 0,j = list.size()-1;
while(i <= j) {
if(list.get(i) == list.get(j)) {
i++;
j--;
}else
return false;
}
return true;
}
}
大神代码:
class Solution {
public boolean isPalindrome(String s) {
char[] array = s.toCharArray();
int left = 0;
int right = s.length() - 1;
while (left <= right) {
if (!isValidChar(array[left])) {
left++;
} else if (!isValidChar(array[right])) {
right--;
} else if (!charEquals(array[left], array[right])) {
break;
} else {
left++;
right--;
}
}
return left >= right;
}
private static boolean charEquals(char a, char b) {
return toLowerCaseIfNeeded(a) == toLowerCaseIfNeeded(b);//这种测试用例要考虑到
}
private static boolean isValidChar(char a) {
return (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z') || (a >= '0' && a <= '9');
}
private static char toLowerCaseIfNeeded(char a) {
if(a >= 'A' && a <= 'Z') {
a += UPPER_TO_LOWER;
}
return a;
}
public static char UPPER_TO_LOWER = 'a' - 'A';
}