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; }