Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
For example,
"A man, a plan, a canal: Panama"
is a palindrome.
"race a car"
is not a palindrome.
Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.
For the purpose of this problem, we define empty string as valid palindrome.
Analysis:Use Two pointers, scan from end to start.
Java
public boolean isPalindrome(String s) {
s = s.trim();
if(s.length()<=0) return true;
int start = 0;
int end = s.length()-1;
while(start<end){
while(start<end && !(Character.isLetter(s.charAt(start))||Character.isDigit(s.charAt(start)))) start++;
while(start<end && !(Character.isLetter(s.charAt(end))||Character.isDigit(s.charAt(end)))) end--;
if(s.charAt(start)==s.charAt(end) || s.charAt(start)-'a'==s.charAt(end)-'A'||s.charAt(start)-'A' == s.charAt(end)-'a' ){
start++;
end--;
}else {
break;
}
}
if(start>=end)
return true;
else {
return false;
}
}
Another one:
public boolean isPalindrome(String s) {
if(s.isEmpty()) return true;
int len = s.length();
int start = 0;
int end = len-1;
while(start<=end){
if(!isAlp(s.charAt(start))){
start++;
continue;
}
if(!isAlp(s.charAt(end))){
end--;
continue;
}
if(s.charAt(start)==s.charAt(end) || Math.abs(s.charAt(start)-s.charAt(end))==32){
start++;
end--;
}else
return false;
}
return true;
}
public boolean isAlp(char c){
if((c<='z'&&c>='a')||(c<='Z'&&c>='A')|| (c>='0'&&c<='9'))
return true;
else
return false;
}
c++
bool isPalindrome(string s) {
if(s.empty()) return true;
int len = s.length();
int r = len-1;
int l = 0;
while(l<=r){
if((s[l] >= 'a' && s[l]<='z') || (s[l]>='A' && s[l]<='Z')||(s[l])>='0'&& s[l]<='9'){
if((s[r] >= 'a' && s[r]<='z') || (s[r]>='A' && s[r]<='Z')||(s[r]>='0' && s[r]<='9')){
if(s[l] == s[r] || s[l]-'a'==s[r]-'A' || s[l]-'A' == s[r]-'a'){
l++;
r--;
}
else
return false;
}else{
r--;
continue;
}
}
else{
l++;
continue;
}
}
return true;
}