题目
解答:
前后两个指针,分别指向字符串的头和尾
自左向右找到第一个有效的字符,跳过无效的字符,
自右向左,找到第一个有效的字符,跳过无效的字符
比较两个字符是否相等,忽略大小写
循环
代码:
public class Solution {
/**
* @param s A string
* @return Whether the string is a valid palindrome
*/
public boolean isPalindrome(String s) {
// Write your code here
if(s == null)
return false;
int len = s.length();
int left = 0;
int right = len -1;
//空串”“,返回true
while(left < right){
//自左向右,第一个有效字符
while(left <= right && !isValid(s.charAt(left)))
left++;
//自右向左,第一个有效字符
while(right >= left && !isValid(s.charAt(right)))
right--;
//遍历比较完毕,返回true
if(left == len || right == len)
return true;
//比较两个字符
if(!isEqual(s.charAt(left), s.charAt(right)))
return false;
left++;
right--;
}
return true;
}
public boolean isValid(char c){
if((c>='a' && c<='z')||(c>='A' && c <= 'Z')||(c>='0'&& c <='9'))
return true;
else
return false;
}
/**
*比较两个字符是否相同,忽略大小写
*/
public boolean isEqual(char a, char b){
if(a==b)
return true;
if(a >= 'a' && a <= 'z')
a = (char)(a - 'a' + 'A');
if(b >= 'a' && b <= 'z')
b = (char)(b - 'a' + 'A');
return a ==b?true:false;
}
}