125. 验证回文串(LeetCode)
题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
条件分析
- 回文串是指对称的字符串;
- 只需要考虑字母和数字,忽略大小写;
- 空字符串为有效回文串;
解题思路(指针对撞)
- 定义两个指针left和right分别指向字符串的首尾,如果不相等,则不是(快速失败),否则一直比较到两个指针相遇(说明是回文串)
- 要快速跳过无效字符和比较是否相等,可考虑使用字符的ascii码来进行判断;
编码如下
public boolean isPalindrome(String s) {
char[] charArray = s.toCharArray();
int left = 0;
int right = charArray.length-1;
char leftChar,rightChar;
while(left<right) {
leftChar = charArray[left];
if(!isLetterOrDigit(leftChar)) {
left++;
continue;
}
rightChar = charArray[right];
if(!isLetterOrDigit(rightChar)) {
right--;
continue;
}
int substract = leftChar - rightChar;
if (isDigit(leftChar) || isDigit(rightChar)) {
if (substract != 0) {
return false;
}
}
if (substract != 0 && substract != 32 && substract != -32) {
return false;
}
left++;
right--;
}
return true;
}
public boolean isDigit(char c) {
return c>='0' && c<='9';
}
public boolean isLetterOrDigit(char c) {
return isDigit(c) || (c>='a' && c<='z') || (c>='A' && c<='Z');
}
浙公网安备 33010602011771号