题目描述:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama" 输出: true
示例 2:
输入: "race a car" 输出: false
思路:
一开始是想借助reverse翻转进行判断的,但是其中包含太多杂项,而自己又不会正则表达式,只好用遍历的方式。根据回文的特点,采用双指针前后同时遍历,有相同的字符就计数,最终左右遍历的计数相同则为回文串。遍历时先进行杂项排除,筛选除符合条件的字符。
class Solution {
public boolean isPalindrome(String s) {
s = s.toLowerCase();
int left_nums = 0, right_nums = 0;
int left_pointer = 0, right_pointer = s.length() - 1;
int left_ascii = 0, right_ascii = 0;
boolean left_legal, right_legal;
while (left_pointer < right_pointer) {
// 筛选字符
left_ascii = s.charAt(left_pointer) - 0;
right_ascii = s.charAt(right_pointer) - 0;
left_legal = (left_ascii >= 48 && left_ascii <= 57)
|| (left_ascii >= 65 && left_ascii <= 90)
|| (left_ascii >= 97 && left_ascii <= 122);
right_legal = (right_ascii >= 48 && right_ascii <= 57)
|| (right_ascii >= 65 && right_ascii <= 90)
|| (right_ascii >= 97 && right_ascii <= 122);
// 判断字符
if (left_legal == false) {
left_pointer++;
continue;
}
if (right_legal == false) {
right_pointer--;
continue;
}
if (left_ascii == right_ascii) {
left_pointer++;
left_nums++; // 左计数
right_pointer--;
right_nums++; // 右计数
} else
return false;
}
return left_nums == right_nums ? true : false;
}
}